From c651acf748dcc0d2a6d532fa10f1ee05ac7367b4 Mon Sep 17 00:00:00 2001 From: devlights Date: Thu, 22 May 2025 09:24:01 +0000 Subject: [PATCH] Add flags/vars2.go --- examples/basic/flags/README.md | 1 + examples/basic/flags/examples.go | 1 + examples/basic/flags/var2.go | 71 ++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 examples/basic/flags/var2.go diff --git a/examples/basic/flags/README.md b/examples/basic/flags/README.md index 87ee9a7f..b23581b8 100644 --- a/examples/basic/flags/README.md +++ b/examples/basic/flags/README.md @@ -6,6 +6,7 @@ | ------------- | ---------------- | ----------------------------------------------------------------- | | flagset.go | flags_flagset | flag.Flagset のサンプルです | | var.go | flags_var | flag.Var() のサンプルです | +| var2.go | flags_var2 | flag.Var() のサンプルです。(2) 同じオプションを複数回指定。 | | int.go | flags_int | flag.Int(), flag.IntVar() のサンプルです | | bool.go | flags_bool | flag.Bool(), flag.BoolVar() のサンプルです | | string.go | flags_string | flag.String(), flag.StringVar() のサンプルです | diff --git a/examples/basic/flags/examples.go b/examples/basic/flags/examples.go index 607d1757..ec1aaff7 100644 --- a/examples/basic/flags/examples.go +++ b/examples/basic/flags/examples.go @@ -15,6 +15,7 @@ func NewRegister() mapping.Register { func (r *register) Regist(m mapping.ExampleMapping) { m["flags_flagset"] = Flagset m["flags_var"] = Var + m["flags_var2"] = Var2 m["flags_int"] = Int m["flags_bool"] = Bool m["flags_string"] = String diff --git a/examples/basic/flags/var2.go b/examples/basic/flags/var2.go new file mode 100644 index 00000000..f484ff63 --- /dev/null +++ b/examples/basic/flags/var2.go @@ -0,0 +1,71 @@ +package flags + +import ( + "flag" + "fmt" + + "github.com/devlights/gomy/output" +) + +type ( + varsFlag []string +) + +func (me *varsFlag) String() string { + return fmt.Sprint(*me) +} + +func (me *varsFlag) Set(v string) error { + *me = append(*me, v) + return nil +} + +var ( + // varsFlag は flag.Value を実装している + _ flag.Value = (*varsFlag)(nil) +) + +// Var2 は、flagパッケージのflag.Var()のサンプルです。 +// +// コマンドライン引数にて同じオプションを複数回指定された場合に対応できる +// カスタムフラグを定義して、値を読み取っています。 +// +// # REFERENCES +// - https://pkg.go.dev/flag@go1.24.3 +func Var2() error { + var ( + fs = flag.NewFlagSet("vars", flag.ExitOnError) + vars varsFlag + ) + fs.Var(&vars, "v", "文字列値。複数指定可能。") + + var ( + opts = []string{ + "-v", "hello", + "-v", "world", + "-v", "へろー", + "-v", "ワールド", + } + err error + ) + err = fs.Parse(opts) + if err != nil { + return err + } + + var ( + ch = make(chan string) + ) + go func(ch chan<- string, vars []string) { + defer close(ch) + for _, item := range vars { + ch <- item + } + }(ch, vars) + + for item := range ch { + output.Stdoutl("[vars]", item) + } + + return nil +}