hymkor/struct2flag から fork した goark/struct2pflag をリリースした
以前 golang セクションで紹介した hymkor/struct2flag だが,これは標準の flag パッケージを使っている。
他の類似の flag パッケージついては
オプション体系が GNU っぽくなってしまったり、"flag" の機能まで内包していて、そこまで要らないということで選定候補から外した
とのことで,それはそれで妥当な選択だと思う。
ただ,私は GNU 拡張シンタックスに対応した spf13/pflag が使いたかったのよ。
というわけで,オリジナルの hymkor/struct2flag から fork して spf13/pflag を使うよう改造した goark/struct2pflag をリリースした1。
使い方は hymkor/struct2flag とほぼ同じ。
以前書いた「struct2flag でコマンドライン解析」のコードを goark/struct2pflag を使って書き換えてみる。
package main
import (
"fmt"
"strings"
"github.com/goark/struct2pflag"
"github.com/spf13/pflag"
)
type Flags struct {
N bool `pflag:"no-newline,n,omit trailing newline"`
Sep string `pflag:"sep,s,separator"`
Strs []string
}
func NewFlags() *Flags {
return &Flags{N: false, Sep: " ", Strs: []string{}}
}
func Echo(f *Flags) {
fmt.Print(strings.Join(f.Strs, f.Sep))
if !f.N {
fmt.Println()
}
}
func main() {
f := NewFlags()
struct2pflag.BindDefault(f)
pflag.Parse()
f.Strs = pflag.Args()
Echo(f)
}
flag が spf13/pflag に hymkor/struct2flag が goark/struct2pflag に置き換わったほか,構造体タグのプレフィックスが flag: から pflag: に変わっている点に注目。
ヘルプを表示させると
$ go run echo4a.go -h
Usage of /tmp/go-build2259633867/b001/exe/echo4a:
-n, --no-newline omit trailing newline
-s, --sep string separator (default " ")
てな感じに長いオプション名と一文字の短いオプション名が併記されているのが分かる。 実際に動かしてみると
$ go run echo4a.go --sep / May the Force be with you
May/the/Force/be/with/you
$ go run echo4a.go -s / May the Force be with you
May/the/Force/be/with/you
と長いオプション名でも短いオプション名でも同じ動作になることが分かる。
spf13/pflag の挙動については拙文「標準 flag パッケージを pflag パッケージに置き換える」で簡単に紹介しているので,そちらも参考にどうぞ。
hymkor/struct2flag で使う構造体タグ flag: も受け入れるようにした(flag: と pflag: は混在可能)。
type Flags struct {
N bool `flag:"n,omit trailing newline"`
Sep string `flag:"s,separator"`
Strs []string
}
ただし,この場合は長いオプション名のみ定義されるため
$ go run echo4b.go -h
Usage of /tmp/go-build1365887832/b001/exe/echo4b:
--n omit trailing newline
--s string separator (default " ")
という感じに,あくまでも spf13/pflag のルールで構成されるのでご注意を。
一応 hymkor/struct2flag と同程度の機能は持たせている。
今後は浮動小数点数や時間を指定できたらいいな,と思っている。
他に spf13/pflag ではオプション値を格納する変数側を slice にすることで同じオプションを複数回指定できる機能もあるので,それもサポートしたいところ。
まぁ,あくまでも私が使う際に必要に応じて拡張するということで。
リクエスト等ありましたら PR いただけると助かります。
参考図書
- 初めてのGo言語 第2版 ―他言語プログラマーのためのイディオマティックGo実践ガイド
- Jon Bodner (著), 武舎 広幸 (翻訳)
- オライリー・ジャパン 2025-08-05 (Release 2025-08-05)
- 単行本(ソフトカバー)
- 4814401191 (ASIN), 9784814401192 (EAN), 4814401191 (ISBN)
- 評価
第2版。 Generics の説明が大幅に改訂されたらしい。練習問題も追加されている。
- Go言語 100Tips ありがちなミスを把握し、実装を最適化する impress top gearシリーズ
- Teiva Harsanyi (著), 柴田 芳樹 (著)
- インプレス 2023-08-18 (Release 2023-08-18)
- Kindle版
- B0CFL1DK8Q (ASIN)
- 評価
版元で PDF 版を購入可能。事実上の Effective Go とも言える充実の内容。オリジナルは敢えてタイトルに “tips” という単語を入れるのを避けたのに邦題が「100 Tips」とかなっていて,原作者がお怒りとの噂(あくまで噂)
- プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
- 丸善出版 2016-06-20
- 単行本(ソフトカバー)
- 4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN)
- 評価
著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。と思ったら絶版状態らしい(2025-01 現在)。復刊を望む!
-
最初は GitHub の fork 機能をそのまま使っていたが自己 pull request の際に,うっかりオリジナルの
hymkor/struct2flagの方に PR しそうになったため fork 関係を切り離した。やり方は「GithubでForkしたリポジトリをFork元から切り離して管理する」を参考にした。ありがたや 🙇 ↩︎



