Goを使用してCLIフラグを処理する方法はたくさんあります。最初のオプションは、ライブラリをまったく使用せず、検査することです。os.Args
。 2番目のオプションは、標準ライブラリを使用することですflag
パッケージ。 3番目のオプションは、次のような多くのサードパーティCLIライブラリの1つを使用することです。コブラ。
2番目のオプションについて話しましょう:標準ライブラリを使用するflag
、の生の解析よりも多くの利点を提供するためos.Args
そしてそれは内蔵されています。
追加import "flag"
パッケージのインポートセクションに移動すると、すぐに使用できます。
受け入れるにはint
パラメータタイプ:
func Int(name string, value int, usage string) *int
var count = flag.Int(“count”, 5, “the count of items”)
fmt.Println("count value ", *count)
最初のパラメーターはCLIコマンドで使用されるフラグ名、2番目のパラメーターはデフォルト値、3番目は説明です。
代替構文はによって提供されますflag.IntVar()
:
func IntVar(p *int, name string, value int, usage string)
var count int
flag.IntVar(&count, “count”, 5, “the count of items”)
fmt.Println("count value ", count)
ここでパラメーターはシフトされ、最初のパラメーターは変数参照です。
主な違いは、最初のケースでは、ポインターを取得することです。 2番目のケースでは、値を取得します。
flag
さまざまなフラグタイプを解析するための多くの関数を提供します。受け入れるタイプごとに異なる関数を使用する必要があります。
func Bool(name string, value bool, usage string) *bool
func BoolVar(p *bool, name string, value bool, usage string)
func Duration(name string, value time.Duration, usage string) *time.Duration
func DurationVar(p *time.Duration, name string, value time.Duration, usage string)
func Float64(name string, value float64, usage string) *float64
func Float64Var(p *float64, name string, value float64, usage string)
func Int(name string, value int, usage string) *int
func Int64(name string, value int64, usage string) *int64
func Int64Var(p *int64, name string, value int64, usage string)
func IntVar(p *int, name string, value int, usage string)
func String(name string, value string, usage string) *string
func StringVar(p *string, name string, value string, usage string)
func Uint(name string, value uint, usage string) *uint
func Uint64(name string, value uint64, usage string) *uint64
func Uint64Var(p *uint64, name string, value uint64, usage string)
func UintVar(p *uint, name string, value uint, usage string)
フラグに間違ったタイプを渡すと、エラーが発生し、プログラムが停止し、必要な使用法がユーザーに出力されます。
例として、文字列を解析する方法は次のとおりです。
var description = flag.String("description", "default value", "the description of the flag")
フラグ構文
どのようにフラグを設定しますか?シンプル:アタッチ-flagname
CLIコマンドに、4つの代替の同等の構文を使用します。
-count=x
-count x
--count=x
--count x
コマンドに必要な数のフラグを渡すことができますが、初めてですflag
フラグを認識しない場合、追加のフラグの解析を停止します。これは、フラグ以外のパラメータもある場合、フラグはすべて最初に配置する必要があることを意味します。
フラグを解析します
すべてのフラグを定義した後、呼び出す必要があります
flag.Parse()
実際にそれらを解析します。
ブールフラグ
ブールフラグは、追加するだけで設定できます-count
、ブールフラグにtrue
値。を設定するにはfalse
値、使用-count=false
。これらの値はいずれもブールフラグに有効です。1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False
。
短い代替案
現実の世界では、CLIアプリがわかりやすい名前のフラグと、文字の省略形の同じフラグを受け入れることがよくあります。 2つのフラグハンドラーを提供することでそれを行うことができます。
var gopherType string
func init() {
const (
defaultGopher = “pocket”
usage = “the variety of gopher”
)
flag.StringVar(&gopherType, “gopher_type”, defaultGopher, usage)
flag.StringVar(&gopherType, “g”, defaultGopher, usage+" (shorthand)")
}
非フラグパラメータの解析
ザ・flag
パッケージは、フラグ以外のパラメーターも解析するメソッドを提供します。
flag.Args()
フラグとして解析されていないパラメータを持つ文字列のスライスを返します。
必要に応じてフラグを強制する
ザ・flag
パッケージは、この問題の組み込みソリューションを提供していません。このケースは自分で管理する必要があります。
// [...]
flag.Parse()
if *count == “” {
flag.PrintDefaults()
os.Exit(1)
}
より高度なトピック
これは紹介記事です。ここから、サブコマンドの実装や独自のフラグタイプの定義など、より詳細なトピックに進むことができます。見るhttps://blog.komand.com/build-a-simple-cli-tool-with-golangCLIのより高度な使用法について。
参照
- https://golang.org/pkg/flag/
- https://thenewstack.io/cli-command-line-programming-with-go/
- https://blog.komand.com/build-a-simple-cli-tool-with-golang
その他のチュートリアル:
- NGINXリバースプロキシを使用してGoサービスを提供する
- Goで構造体のコピーを作成する
- GoWebサーバーの基本
- Goでのマップタイプの並べ替え
- 一言で言えばポインタを移動します
- タグの説明に行く
- 日付と時刻のフォーマットに移動
- Goを使用したJSON処理
- 可変個引数関数に移動
- GoStringsチートシート
- GoEmptyインターフェイスの説明
- Go withVSCodeとDelveのデバッグ
- NamedGoはパラメータを返します
- Goで乱数と文字列を生成する
- Goプロジェクトのファイルシステム構造
- Goに実装された二分探索アルゴリズム
- Goでのコマンドラインフラグの使用
- GOPATHの説明
- Goでコマンドラインアプリを作成する:lolcat
- Goを使用したCLIコマンドの作成:cowsay
- Goでのシェルパイプの使用
- CLIチュートリアルに移動:フォーチュンクローン
- Goを使用してフォルダ内のファイルを一覧表示します
- Goを使用して、GitHubからリポジトリのリストを取得します
- 移動し、文字列のスライスをファイルに追加します
- 文字列をバイトスライスに変換します
- GoでローカルGitの貢献を視覚化する
- GoCPUとメモリプロファイリングの開始
- Goプログラムの「インデックス作成をサポートしていません」エラーを解決する
- Goプログラムでの実行時間の測定
- 重複するタイトルを検出するためにGoを使用してWebクローラーを構築する
- ベストプラクティスに進む:ポインターまたは値のレシーバー?
- ベストプラクティスに進む:メソッドまたは関数を使用する必要がありますか?
- データ構造の移動:設定
- マップのチートシートに移動
- Goでジェネリック型の実装を生成する
- Goデータ構造:辞書
- Goデータ構造:ハッシュテーブル
- Go throughChannelsにイベントリスナーを実装する
- Goデータ構造:スタック
- データ構造の移動:キュー
- Goデータ構造:二分探索木
- Goデータ構造:グラフ
- Goデータ構造:リンクリスト
- Goデータ構造の完全ガイド
- Go値の比較
- Goはオブジェクト指向ですか?
- GoでのSQLデータベースの操作
- Goでの環境変数の使用
- チュートリアルに進む:PostgreSQLに裏打ちされたREST API
- GoWebサーバーでのCORSの有効化
- DockerコンテナへのGoアプリケーションのデプロイ
- GoがPHP開発者として学ぶための強力な言語である理由
- 移動し、io.Reader.ReadString改行文字を削除します
- 移動、変更を監視してプログラムを再構築する方法
- 行って、日付からの月を数えます
- GoでHTTPPOSTパラメーターにアクセスする