いろいろ備忘録日記

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

Goメモ-584 (flagパッケージ再入門)(08-複数回指定可能なパラメータを用意)

関連記事

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

概要

以下、自分用のメモです。

前にflagパッケージについてのメモをいろいろ書いてたのですが

そういえば、複数回指定できるパラメータの作成についてはメモしていないなと思ったので、メモ残しておくことにしました。

複数回指定可能なパラメータを実現するには、flag.Var() を使います。flag.Valueインターフェースを実装した型を定義してそこに追加していく感じです。

サンプル

main.go

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
}

実行

$ task
task: [build] go build -o "/workspaces/try-golang/try-golang" .
task: [run] ./try-golang -onetime

ENTER EXAMPLE NAME: flags_var2

[Name] "flags_var2"
[vars]               hello
[vars]               world
[vars]               へろー
[vars]               ワールド


[Elapsed] 128.76µs

参考情報

Goのおすすめ書籍


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

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