いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-460 (flagパッケージ再入門)(07-Subcommand)

関連記事

Windows Terminal上でNushellを使うとプロンプトがチカチカ(blink) する件 - いろいろ備忘録日記

Goメモ-454 (flagパッケージ再入門)(01-FlagSet) - いろいろ備忘録日記

Goメモ-455 (flagパッケージ再入門)(02-Var) - いろいろ備忘録日記

Goメモ-456 (flagパッケージ再入門)(03-Duration) - いろいろ備忘録日記

Goメモ-457 (flagパッケージ再入門)(04-Func) - いろいろ備忘録日記

Goメモ-458 (flagパッケージ再入門)(05-TextVar) - いろいろ備忘録日記

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。忘れないうちにメモメモ。。。

最近、flaggy とかを利用していて、あまりflagパッケージを触らなくなってきているのですが

小さなツールをちゃちゃっとワンタイムで利用するときは、やっぱり使ったりします。

使っていないと忘れてしまいそうなので、ここに自分の備忘録として残しておこうと思います。

今回は、サブコマンドについて。

flagパッケージを使って、サブコマンドを実現する場合はflag.FlagSetでそれぞれのサブコマンドを表現します。

サブコマンドの数が多い場合や細かな制御などをしたい場合は、flaggy などの外部ライブラリを利用する方が楽です。

サンプル

package flags

import (
    "flag"
    "fmt"
)

// Subcommand は、flagパッケージを使ってサブコマンドを実現するサンプルです.
//
// flagパッケージを使って、サブコマンドを実現する場合は
// flag.FlagSetでそれぞれのサブコマンドを表現する。
//
// サブコマンドの数が多い場合や細かな制御などをしたい場合は
// [flaggy](https://github.com/integrii/flaggy) などの外部ライブラリを利用する方が楽。
//
// flaggyのサンプルについては [try-golang-extlib](https://github.com/devlights/try-golang-extlib/tree/main/examples/singleapp/flaggy) を参照。
//
// # REFERENCES
//   - https://oohira.github.io/gobyexample-jp/command-line-subcommands.html
//   - https://pkg.go.dev/flag
//   - https://github.com/integrii/flaggy
func Subcommand() error {
    var (
        sub1 = flag.NewFlagSet("sub1", flag.ExitOnError) // サブコマンド
        sub2 = flag.NewFlagSet("sub2", flag.ExitOnError) // サブコマンド

        sub1BoolVal bool
        sub2IntVal  int
    )
    sub1.BoolVar(&sub1BoolVal, "enable", false, "bool flag")
    sub2.IntVar(&sub2IntVal, "value", 0, "int flag")

    //
    // 引数の1つ目がサブコマンドとなるので、それで振り分け
    //
    var (
        argsList = [][]string{
            {"sub1"},
            {"sub2"},
            {"sub1", "-enable"},
            {"sub2", "-value", "100"},
        }
    )
    for _, args := range argsList {
        switch args[0] {
        case "sub1":
            sub1.Parse(args[1:])
            fmt.Printf("[sub1] enable=%v\n", sub1BoolVal)
        case "sub2":
            sub2.Parse(args[1:])
            fmt.Printf("[sub2] value=%v\n", sub2IntVal)
        }
    }

    return nil

    /*
      $ task
      task: [build] go build .
      task: [run] ./try-golang -onetime

      ENTER EXAMPLE NAME: flags_subcommand

      [Name] "flags_subcommand"
      [sub1] enable=false
      [sub2] value=0
      [sub1] enable=true
      [sub2] value=100


      [Elapsed] 37.48µs
   */

}

参考情報

Goメモ-428 (flaggyメモ)(01) - いろいろ備忘録日記

Goメモ-429 (flaggyメモ)(02) - いろいろ備忘録日記

Goメモ-430 (flaggyメモ)(03) - いろいろ備忘録日記

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。