pflag는 POSIX/GNU 스타일 --flags를 구현하는 Go 플래그 패키지의 드롭인 대체품입니다.
pflag는 명령줄 옵션에 대한 POSIX 권장 사항에 대한 GNU 확장과 호환됩니다. 더 정확한 설명은 아래의 "명령줄 플래그 구문" 섹션을 참조하세요.
pflag는 LICENSE 파일에서 찾을 수 있는 Go 언어와 동일한 스타일의 BSD 라이센스로 사용할 수 있습니다.
pflag는 표준 go get
명령을 사용하여 사용할 수 있습니다.
다음을 실행하여 설치합니다.
go get github.com/spf13/pflag
다음을 실행하여 테스트를 실행하세요.
go test github.com/spf13/pflag
pflag는 Go의 기본 플래그 패키지를 즉시 대체합니다. "flag"라는 이름으로 pflag를 가져오면 모든 코드가 변경 없이 계속 작동해야 합니다.
import flag "github.com/spf13/pflag"
여기에는 한 가지 예외가 있습니다. Flag 구조체를 직접 인스턴스화하는 경우 설정해야 할 "Shorthand" 필드가 하나 더 있습니다. 대부분의 코드는 이 구조체를 직접 인스턴스화하지 않고 대신 String(), BoolVar() 및 Var()과 같은 함수를 사용하므로 영향을 받지 않습니다.
flag.String(), Bool(), Int() 등을 사용하여 플래그를 정의합니다.
이는 *int 유형으로 포인터 ip에 저장된 정수 플래그 -flagname을 선언합니다.
var ip * int = flag . Int ( "flagname" , 1234 , "help message for flagname" )
원하는 경우 Var() 함수를 사용하여 플래그를 변수에 바인딩할 수 있습니다.
var flagvar int
func init () {
flag . IntVar ( & flagvar , "flagname" , 1234 , "help message for flagname" )
}
또는 Value 인터페이스(포인터 수신기 포함)를 충족하는 사용자 정의 플래그를 생성하고 이를 플래그 구문 분석에 결합할 수 있습니다.
flag . Var ( & flagVal , "name" , "help message for flagname" )
이러한 플래그의 경우 기본값은 변수의 초기 값일 뿐입니다.
모든 플래그가 정의된 후 다음을 호출합니다.
flag . Parse ()
명령줄을 정의된 플래그로 구문 분석합니다.
그런 다음 플래그를 직접 사용할 수 있습니다. 플래그 자체를 사용하는 경우 플래그는 모두 포인터입니다. 변수에 바인딩하면 값이 됩니다.
fmt . Println ( "ip has value " , * ip )
fmt . Println ( "flagvar has value " , flagvar )
FlagSet이 있지만 코드의 모든 포인터를 따라가기가 어려운 경우 Flag에 저장된 값을 가져오는 데 사용할 수 있는 도우미 함수가 있습니다. int 유형의 'flagname'이라는 플래그가 있는 pflag.FlagSet이 있는 경우 GetInt()를 사용하여 int 값을 가져올 수 있습니다. 하지만 'flagname'은 존재해야 하며 int여야 합니다. GetString("플래그 이름")은 실패합니다.
i , err := flagset . GetInt ( "flagname" )
구문 분석 후 플래그 뒤의 인수는 슬라이스 flag.Args()로 사용하거나 개별적으로 flag.Arg(i)로 사용할 수 있습니다. 인수는 0부터 flag.NArg()-1을 통해 인덱싱됩니다.
pflag 패키지는 또한 플래그에 없는 한 글자로 된 플래그 단축어를 제공하는 몇 가지 새로운 함수를 정의합니다. 플래그를 정의하는 함수 이름에 'P'를 추가하여 이를 사용할 수 있습니다.
var ip = flag . IntP ( "flagname" , "f" , 1234 , "help message" )
var flagvar bool
func init () {
flag . BoolVarP ( & flagvar , "boolname" , "b" , true , "help message" )
}
flag . VarP ( & flagVal , "varname" , "v" , "help message" )
단축 문자는 명령줄에서 단일 대시와 함께 사용할 수 있습니다. 부울 속기 플래그는 다른 속기 플래그와 결합될 수 있습니다.
명령줄 플래그의 기본 세트는 최상위 기능에 의해 제어됩니다. FlagSet 유형을 사용하면 명령줄 인터페이스에서 하위 명령을 구현하는 등 독립적인 플래그 집합을 정의할 수 있습니다. FlagSet의 메소드는 명령줄 플래그 세트에 대한 최상위 기능과 유사합니다.
플래그를 생성한 후 지정된 플래그에 대해 pflag.NoOptDefVal을 설정할 수 있습니다. 이렇게 하면 플래그의 의미가 약간 변경됩니다. 플래그에 NoOptDefVal이 있고 플래그가 옵션 없이 명령줄에 설정된 경우 플래그는 NoOptDefVal로 설정됩니다. 예를 들어 다음과 같습니다.
var ip = flag . IntP ( "flagname" , "f" , 1234 , "help message" )
flag . Lookup ( "flagname" ). NoOptDefVal = "4321"
다음과 같은 결과가 나올 것입니다.
구문 분석된 인수 | 결과 값 |
---|---|
--플래그 이름=1357 | 아이피=1357 |
--플래그 이름 | 아이피=4321 |
[아무것도 아님] | 아이피=1234 |
--flag // boolean flags, or flags with no option default values
--flag x // only on flags without a default value
--flag=x
플래그 패키지와 달리 옵션 앞의 단일 대시는 이중 대시와는 다른 의미입니다. 단일 대시는 플래그에 대한 일련의 약칭 문자를 나타냅니다. 마지막 단축 문자를 제외한 모든 문자는 부울 플래그 또는 기본값이 있는 플래그여야 합니다.
// boolean or flags where the 'no option default value' is set
-f
-f=true
-abc
but
-b true is INVALID
// non-boolean and flags without a 'no option default value'
-n 1234
-n=1234
-n1234
// mixed
-abcs "hello"
-absd="hello"
-abcs1234
플래그 구문 분석은 종결자 "--" 다음에 중지됩니다. 플래그 패키지와 달리 플래그는 이 종결자 앞 명령줄의 어느 위치에나 인수와 함께 배치될 수 있습니다.
정수 플래그는 1234, 0664, 0x1234를 허용하며 음수일 수 있습니다. 부울 플래그(긴 형식)는 1, 0, t, f, true, false, TRUE, FALSE, True, False를 허용합니다. 기간 플래그는 time.ParseDuration에 유효한 모든 입력을 허용합니다.
사용자 정의 플래그 이름 '정규화 함수'를 설정할 수 있습니다. 이를 통해 코드에서 생성될 때와 명령줄에서 일부 '정규화된' 형식으로 사용될 때 플래그 이름을 변경할 수 있습니다. 비교에는 '정규화된' 형식이 사용됩니다. 사용자 정의 정규화 기능을 사용하는 두 가지 예는 다음과 같습니다.
예 #1 : -, _ 및 를 원합니다. 플래그에서 동일하게 비교합니다. 일명 --my-flag == --my_flag == --my.flag
func wordSepNormalizeFunc ( f * pflag. FlagSet , name string ) pflag. NormalizedName {
from := [] string { "-" , "_" }
to := "."
for _ , sep := range from {
name = strings . Replace ( name , sep , to , - 1 )
}
return pflag . NormalizedName ( name )
}
myFlagSet . SetNormalizeFunc ( wordSepNormalizeFunc )
예 #2 : 두 개의 플래그에 별칭을 지정하려고 합니다. 일명 --old-flag-name == --new-flag-name
func aliasNormalizeFunc ( f * pflag. FlagSet , name string ) pflag. NormalizedName {
switch name {
case "old-flag-name" :
name = "new-flag-name"
break
}
return pflag . NormalizedName ( name )
}
myFlagSet . SetNormalizeFunc ( aliasNormalizeFunc )
플래그를 더 이상 사용하지 않거나 약칭으로 사용하는 것이 가능합니다. 플래그/속기를 사용하지 않으면 도움말 텍스트에서 해당 플래그/속기를 숨기고 사용되지 않는 플래그/속기를 사용할 때 사용법 메시지를 인쇄합니다.
예 #1 : "badflag"라는 플래그를 더 이상 사용하지 않고 대신 사용해야 하는 플래그를 사용자에게 알리려고 합니다.
// deprecate a flag by specifying its name and a usage message
flags . MarkDeprecated ( "badflag" , "please use --good-flag instead" )
이렇게 하면 도움말 텍스트에서 "badflag"가 숨겨지고 Flag --badflag has been deprecated, please use --good-flag instead
.
예 #2 : 플래그 이름 "noshorthandflag"를 유지하려고 하지만 단축 이름 "n"은 더 이상 사용하지 않습니다.
// deprecate a flag shorthand by specifying its flag name and a usage message
flags . MarkShorthandDeprecated ( "noshorthandflag" , "please use --noshorthandflag only" )
이렇게 하면 도움말 텍스트에서 단축 이름 "n"이 숨겨지고 Flag shorthand -n has been deprecated, please use --noshorthandflag only
.
여기서는 사용법 메시지가 필수적이므로 비워둘 수 없습니다.
플래그를 숨김으로 표시할 수 있습니다. 즉, 플래그는 여전히 정상적으로 작동하지만 사용법/도움말 텍스트에는 표시되지 않습니다.
예 : 내부 용도로만 필요한 "secretFlag"라는 플래그가 있고 도움말 텍스트나 사용법 텍스트에 표시되지 않기를 원합니다.
// hide a flag by specifying its name
flags . MarkHidden ( "secretFlag" )
pflag
사용하면 도움말 및 사용 메시지에 대한 플래그 정렬을 비활성화할 수 있습니다.
예 :
flags . BoolP ( "verbose" , "v" , false , "verbose output" )
flags . String ( "coolflag" , "yeaah" , "it's really cool flag" )
flags . Int ( "usefulflag" , 777 , "sometimes it's very useful" )
flags . SortFlags = false
flags . PrintDefaults ()
출력 :
-v, --verbose verbose output
--coolflag string it's really cool flag (default "yeaah")
--usefulflag int sometimes it's very useful (default 777)
Go의 flag
패키지를 사용하여 정의된 플래그를 지원하려면 pflag
플래그 세트에 추가해야 합니다. 이는 일반적으로 타사 종속성(예: golang/glog
)에 의해 정의된 플래그를 지원하는 데 필요합니다.
예 : CommandLine
플래그 세트에 Go 플래그를 추가하려고 합니다.
import (
goflag "flag"
flag "github.com/spf13/pflag"
)
var ip * int = flag . Int ( "flagname" , 1234 , "help message for flagname" )
func main () {
flag . CommandLine . AddGoFlagSet ( goflag . CommandLine )
flag . Parse ()
}
pflag 패키지의 전체 참조 문서는 godoc.org에서 보거나 godoc -http=:6060
실행하고 http://localhost:6060/pkg/github.com/spf13/pflag를 검색하여 go의 표준 문서 시스템을 통해 볼 수 있습니다. 설치 후.