Skip to content

Commit 63c6512

Browse files
authored
Merge pull request #833 from devlights/add-flag-subcommand-example
2 parents d22da04 + b6d1f86 commit 63c6512

File tree

3 files changed

+87
-11
lines changed

3 files changed

+87
-11
lines changed

examples/basic/flags/README.md

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22

33
このディレクトリには以下のサンプルがあります。
44

5-
| file | example name | note |
6-
| ----------- | -------------- | ----------------------------------------------------------------- |
7-
| flagset.go | flags_flagset | flag.Flagset のサンプルです |
8-
| var.go | flags_var | flag.Var() のサンプルです |
9-
| int.go | flags_int | flag.Int(), flag.IntVar() のサンプルです |
10-
| bool.go | flags_bool | flag.Bool(), flag.BoolVar() のサンプルです |
11-
| string.go | flags_string | flag.String(), flag.StringVar() のサンプルです |
12-
| duration.go | flags_duration | flag.Duration(), flag.DurationVar() のサンプルです |
13-
| func.go | flags_func | flag.Func() のサンプルです |
14-
| textvar.go | flags_textvar | flag.TextVar() のサンプルです |
15-
| nargs.go | flags_nargs | flag.Arg(), flag.Args(), flag.NArg(), flag.NFlag() のサンプルです |
5+
| file | example name | note |
6+
| ------------- | ---------------- | ----------------------------------------------------------------- |
7+
| flagset.go | flags_flagset | flag.Flagset のサンプルです |
8+
| var.go | flags_var | flag.Var() のサンプルです |
9+
| int.go | flags_int | flag.Int(), flag.IntVar() のサンプルです |
10+
| bool.go | flags_bool | flag.Bool(), flag.BoolVar() のサンプルです |
11+
| string.go | flags_string | flag.String(), flag.StringVar() のサンプルです |
12+
| duration.go | flags_duration | flag.Duration(), flag.DurationVar() のサンプルです |
13+
| func.go | flags_func | flag.Func() のサンプルです |
14+
| textvar.go | flags_textvar | flag.TextVar() のサンプルです |
15+
| nargs.go | flags_nargs | flag.Arg(), flag.Args(), flag.NArg(), flag.NFlag() のサンプルです |
16+
| subcommand.go | flags_subcommand | flagパッケージを使ってサブコマンドを実現するサンプルです |

examples/basic/flags/examples.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ func (r *register) Regist(m mapping.ExampleMapping) {
2222
m["flags_func"] = Func
2323
m["flags_textvar"] = TextVar
2424
m["flags_nargs"] = Nargs
25+
m["flags_subcommand"] = Subcommand
2526
}

examples/basic/flags/subcommand.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package flags
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
)
7+
8+
// Subcommand は、flagパッケージを使ってサブコマンドを実現するサンプルです.
9+
//
10+
// flagパッケージを使って、サブコマンドを実現する場合は
11+
// flag.FlagSetでそれぞれのサブコマンドを表現する。
12+
//
13+
// サブコマンドの数が多い場合や細かな制御などをしたい場合は
14+
// [flaggy](https://github.com/integrii/flaggy) などの外部ライブラリを利用する方が楽。
15+
//
16+
// flaggyのサンプルについては [try-golang-extlib](https://github.com/devlights/try-golang-extlib/tree/main/examples/singleapp/flaggy) を参照。
17+
//
18+
// # REFERENCES
19+
// - https://oohira.github.io/gobyexample-jp/command-line-subcommands.html
20+
// - https://pkg.go.dev/flag
21+
// - https://github.com/integrii/flaggy
22+
func Subcommand() error {
23+
var (
24+
sub1 = flag.NewFlagSet("sub1", flag.ExitOnError) // サブコマンド
25+
sub2 = flag.NewFlagSet("sub2", flag.ExitOnError) // サブコマンド
26+
27+
sub1BoolVal bool
28+
sub2IntVal int
29+
)
30+
sub1.BoolVar(&sub1BoolVal, "enable", false, "bool flag")
31+
sub2.IntVar(&sub2IntVal, "value", 0, "int flag")
32+
33+
//
34+
// 引数の1つ目がサブコマンドとなるので、それで振り分け
35+
//
36+
var (
37+
argsList = [][]string{
38+
{"sub1"},
39+
{"sub2"},
40+
{"sub1", "-enable"},
41+
{"sub2", "-value", "100"},
42+
}
43+
)
44+
for _, args := range argsList {
45+
switch args[0] {
46+
case "sub1":
47+
sub1.Parse(args[1:])
48+
fmt.Printf("[sub1] enable=%v\n", sub1BoolVal)
49+
case "sub2":
50+
sub2.Parse(args[1:])
51+
fmt.Printf("[sub2] value=%v\n", sub2IntVal)
52+
}
53+
}
54+
55+
return nil
56+
57+
/*
58+
$ task
59+
task: [build] go build .
60+
task: [run] ./try-golang -onetime
61+
62+
ENTER EXAMPLE NAME: flags_subcommand
63+
64+
[Name] "flags_subcommand"
65+
[sub1] enable=false
66+
[sub2] value=0
67+
[sub1] enable=true
68+
[sub2] value=100
69+
70+
71+
[Elapsed] 37.48µs
72+
*/
73+
74+
}

0 commit comments

Comments
 (0)