ホーム プログラミング言語 golang go package Go 言語フラグ パッケージ: コマンド ライン パラメーターの解析






Go 言語フラグ パッケージ: コマンド ライン パラメーターの解析




 
 
コマンド ライン プログラム (ツール、サーバー) を作成する場合、コマンド パラメーターを解析する必要がある場合があります。通常、さまざまなプログラミング言語では、プログラマーの便宜のためにコマンド ライン パラメーターを解析するためのメソッドまたはライブラリが提供されています。 Go言語のflagパッケージでは、コマンドラインパラメータの解析機能が提供されています。

 

flag パッケージで何ができるのか、またどのような機能があるのか​​を見てみましょう。

以下にいくつかの概念を示します。

  • コマンド ライン パラメータ (またはパラメータ): プログラムの実行時に提供されるパラメータを参照します。
  • 定義されたコマンド ライン パラメーター: flag.Type の形式を通じてプログラムで定義されたパラメーターを指します。
  • 非フラグ (非フラグ) コマンド ライン パラメーター (または予約されたコマンド ライン パラメーター): 単純に、フラグ パッケージによって解析できないパラメーターとして理解できます。

フラグパッケージの概要

Go 言語の組み込みフラグ パッケージはコマンド ライン パラメーターの解析を実装しており、フラグ パッケージによりコマンド ライン ツールの開発が容易になります。フラグ パッケージを使用するには、まず次のように import キーワードを使用してフラグ パッケージをインポートする必要があります。

import “flag”

フラグパラメータの型

次の表に示すように、フラグ パッケージでサポートされるコマンド ライン パラメーターのタイプは、bool、int、int64、uint、uint64、float、float64、string、duration です。

フラグパラメータ 実効値
文字列 flag 正当な文字列
整数flag 1234、0664、0x1234 およびその他のタイプは負の値にすることもできます
浮動小数点flag 法定浮動小数点
ブール型 flag 1、0、t、f、T、F、true、false、TRUE、FALSE、True、False
期間 flag 「300ms」、「-1.5h」、「2h45m」などの正当な期間文字列。
法定単位は「ns」、「us」、「µs」、「ms」、「s」、「m」、「h」です。
基本的にはflagパッケージを使用します

コマンドライン フラグ パラメーターを定義するには、次の 2 つの一般的な方法があります。

1) flag.Type()

基本的な形式は次のとおりです。

flag.Type(フラグ名、デフォルト値、ヘルプ情報) *Type

型は Int、String、Bool などで、戻り値は対応する型のポインタです。たとえば、名前、年齢、結婚の 3 つのコマンド ライン パラメータを定義したい場合は、次のように定義できます。以下に続きます:

 name := flag.String("名前", "張三", "名前")
age := flag.Int("年齢", 18, "年齢")
married := flag.Bool("既婚", false, "婚姻状態")
delay := flag.Duration("d", 0, "時間間隔") 

このとき、名前、年齢、既婚、遅延はすべて対応する型のポインタであることに注意してください。

2) flag.TypeVar()

基本的な形式は次のとおりです。

flag.TypeVar(型ポインタ、フラグ名、デフォルト値、ヘルプ情報)

TypeVar には、IntVar、StringVar、BoolVar などを指定できます。その機能は、フラグを変数にバインドすることです。たとえば、名前、年齢、結婚という 3 つのコマンド ライン パラメータを定義する場合、次のように定義できます。

 var name string // 名前
var age int // 年齢
var married bool // 結婚しているかどうか
var delay time.Duration // 遅延時間
flag.StringVar(&name, "name", "张三", "名前") // フラグで名前を設定する
flag.IntVar(&age, "age", 18, "年齢") // フラグで年齢を設定する
flag.BoolVar(&married, "married", false, "結婚しているかどうか") // フラグで結婚状況を設定する
flag.DurationVar(&delay, "d", 0, "時間間隔") // フラグで遅延時間を設定する 

flag.Parse()

上記の 2 つの方法でコマンド ライン フラグ パラメータを定義した後、flag.Parse() を呼び出してコマンド ライン パラメータを解析する必要があります。

サポートされているコマンド ライン パラメーターの形式は次のとおりです。

  • -flag: bool 型のみがサポートされます。
  • -フラグ=x;
  • -flag x: 非ブール型のみがサポートされます。

このうち、Boolean型のパラメータは等号で指定する必要があります。

flag パッケージのその他の機能:

flag.Args()  //返回命令行参数后的其他参数,以 []string 类型
flag.NArg()  //返回命令行参数后的其他参数个数
flag.NFlag() //返回使用的命令行参 数个数

上記の導入知識を組み合わせて例を見てみましょう。コードは次のとおりです。

package main

import (
    "flag"
    "fmt"
)

var Input_pstrName = flag.String("name"、 "gerry"、 "あなたの名前を入力してください")
var Input_piAge = flag.Int("age"、20、 "あなたの年齢を入力してください")
var Input_flagvar int

func Init(){
    flag.IntVar(&Input_flagvar、「flagname」、1234、「flagnameのヘルプメッセージ」)
}

func main(){
    Init()
    flag.Parse()

    //解析後、フラグの後にある引数は、スライスflag.Args()または個別にflag.Arg(i)として使用できます。引数は0からflag.NArg()-1までインデックス付けされます
    // Argsは非フラグコマンドライン引数を返します
    // NArgはフラグの処理後に残っている引数の数です
    fmt.Printf( "args =%s、num =%d \ n"、flag.Args()、flag.NArg())
    for i:= 0; i!= flag.NArg(); i ++ {
        fmt.Printf( "arg [%d] =%s \ n"、i、flag.Arg(i))
    }

    fmt.Println( "name ="、* Input_pstrName)
    fmt.Println( "age ="、* Input_piAge)
    fmt.Println( "flagname ="、Input_flagvar)
} 

カスタム値

さらに、flag.Value インターフェイスが実装されている限り (レシーバーはポインター型である必要があります)、カスタム フラグを作成することもできます。このとき、フラグは次の方法で定義できます。

flag.Var(&flagVal, “name”, “help message for flagname”)

[例] お気に入りのプログラミング言語を解析してスライスに直接解析するには、次の slideValue 型を定義し、Value インターフェイスを実装します。

package main

import(
   "flag"
   "fmt"
   "strings"
)

//追加するための型の定義
type sliceValue []string

//コマンドライン引数の値を保持するスライスを作成
func newSliceValue(vals []string, p *[]string) *sliceValue {
   *p = vals
   return (*sliceValue)(p)
}

/*
Valueインターフェース:
type Value interface {
   String() string
   Set(string) error
}
flagパッケージのValueインターフェースを実現し、コマンドラインから受け取った値をカンマで区切ってスライスに保存する
*/
func (s *sliceValue) Set(val string) error {
   *s = sliceValue(strings.Split(val, ","))
   return nil
}

//flagのスライスの初期値は「default is me」、戻り値に関係はない
func (s *sliceValue) String() string {
   *s = sliceValue(strings.Split("default is me", ","))
   return "It's none of my business"
}

/*
-executablename-slice="java,go"最終的には[java、go]を出力します
-executablename Eventually will output [default is me]
*/
func main() {
   var languages []string
   flag.Var(newSliceValue([]string {},&languages),"slice","I like programming `languages`")
   flag.Parse()

   //結果を出力するスライスが受信した値
   fmt.Println(languages)
} 

-slice go,phpの形式でパラメーターを渡し、言語 get [go, php]. -sliceパラメーターを追加しない場合、以下に示すように、デフォルト値[default is me]が出力されます。

go run main.go -slice go,php,java
[go php java]

フラグ内のデュレーションなどの非基本型のサポートでは、これと同様のメソッドが使用されます。つまり、Value インターフェイスも実装されます。

 

「 Go 言語フラグ パッケージ: コマンド ライン パラメーターの解析」についてわかりやすく解説!絶対に観るべきベスト2動画

Go でのフラグの使用の概要
Go言語とは?|プログラミング言語のGo言語について3分でわかりやすく解説します【プログラミング初心者向け】