pflag adalah pengganti paket flag Go, yang mengimplementasikan --flags bergaya POSIX/GNU.
pflag kompatibel dengan ekstensi GNU hingga rekomendasi POSIX untuk opsi baris perintah. Untuk penjelasan yang lebih tepat, lihat bagian "Sintaks tanda baris perintah" di bawah.
pflag tersedia dengan gaya lisensi BSD yang sama dengan bahasa Go, yang dapat ditemukan di file LICENSE.
pflag tersedia menggunakan perintah go get
standar.
Instal dengan menjalankan:
go get github.com/spf13/pflag
Jalankan tes dengan menjalankan:
go test github.com/spf13/pflag
pflag adalah pengganti paket flag asli Go. Jika Anda mengimpor pflag dengan nama "flag" maka semua kode akan tetap berfungsi tanpa perubahan.
import flag "github.com/spf13/pflag"
Ada satu pengecualian untuk ini: jika Anda langsung membuat instance struct Flag, ada satu lagi field "Shorthand" yang perlu Anda atur. Sebagian besar kode tidak pernah membuat instance struct ini secara langsung, melainkan menggunakan fungsi seperti String(), BoolVar(), dan Var(), sehingga tidak terpengaruh.
Tentukan flag menggunakan flag.String(), Bool(), Int(), dll.
Ini mendeklarasikan flag integer, -flagname, yang disimpan di ip pointer, dengan tipe *int.
var ip * int = flag . Int ( "flagname" , 1234 , "help message for flagname" )
Jika mau, Anda bisa mengikat flag ke variabel menggunakan fungsi Var().
var flagvar int
func init () {
flag . IntVar ( & flagvar , "flagname" , 1234 , "help message for flagname" )
}
Atau Anda dapat membuat tanda khusus yang memenuhi antarmuka Nilai (dengan penerima penunjuk) dan memasangkannya untuk menandai penguraian
flag . Var ( & flagVal , "name" , "help message for flagname" )
Untuk tanda seperti itu, nilai default hanyalah nilai awal variabel.
Setelah semua tanda ditentukan, panggil
flag . Parse ()
untuk mengurai baris perintah ke dalam tanda yang ditentukan.
Bendera kemudian dapat digunakan secara langsung. Jika Anda menggunakan flagnya sendiri, semuanya adalah pointer; jika Anda mengikat variabel, itu adalah nilai.
fmt . Println ( "ip has value " , * ip )
fmt . Println ( "flagvar has value " , flagvar )
Ada fungsi pembantu yang tersedia untuk menyimpan nilai dalam Bendera jika Anda memiliki FlagSet tetapi merasa sulit untuk mengikuti semua petunjuk dalam kode Anda. Jika Anda memiliki pflag.FlagSet dengan flag bernama 'flagname' bertipe int Anda dapat menggunakan GetInt() untuk mendapatkan nilai int. Tapi perhatikan bahwa 'flagname' harus ada dan harus berupa int. GetString("flagname") akan gagal.
i , err := flagset . GetInt ( "flagname" )
Setelah penguraian, argumen setelah flag tersedia sebagai flag irisan.Args() atau satu per satu sebagai flag.Arg(i). Argumen diindeks dari 0 hingga flag.NArg()-1.
Paket pflag juga mendefinisikan beberapa fungsi baru yang tidak ada dalam flag, yang memberikan singkatan satu huruf untuk flag. Anda dapat menggunakannya dengan menambahkan 'P' ke nama fungsi apa pun yang mendefinisikan sebuah bendera.
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" )
Huruf singkatan dapat digunakan dengan tanda hubung tunggal pada baris perintah. Bendera steno Boolean dapat digabungkan dengan bendera steno lainnya.
Kumpulan tanda baris perintah default dikontrol oleh fungsi tingkat atas. Tipe FlagSet memungkinkan seseorang untuk menentukan kumpulan bendera yang independen, misalnya untuk mengimplementasikan subperintah dalam antarmuka baris perintah. Metode FlagSet analog dengan fungsi tingkat atas untuk kumpulan flag baris perintah.
Setelah Anda membuat sebuah bendera, Anda dapat menyetel pflag.NoOptDefVal untuk bendera tersebut. Melakukan hal ini sedikit mengubah arti bendera. Jika sebuah bendera memiliki NoOptDefVal dan bendera tersebut disetel pada baris perintah tanpa opsi, bendera tersebut akan disetel ke NoOptDefVal. Misalnya diberikan:
var ip = flag . IntP ( "flagname" , "f" , 1234 , "help message" )
flag . Lookup ( "flagname" ). NoOptDefVal = "4321"
Akan menghasilkan sesuatu seperti
Argumen yang Diurai | Nilai yang Dihasilkan |
---|---|
--nama bendera=1357 | IP=1357 |
--nama bendera | IP=4321 |
[Tidak ada apa-apa] | IP=1234 |
--flag // boolean flags, or flags with no option default values
--flag x // only on flags without a default value
--flag=x
Berbeda dengan paket flag, tanda hubung tunggal sebelum opsi memiliki arti yang berbeda dari tanda hubung ganda. Tanda hubung tunggal menandakan serangkaian huruf singkatan untuk bendera. Semua kecuali huruf steno terakhir harus berupa bendera boolean atau bendera dengan nilai default
// 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
Penguraian bendera berhenti setelah terminator "--". Berbeda dengan paket flag, flag dapat diselingi dengan argumen di manapun pada baris perintah sebelum terminator ini.
Bendera bilangan bulat menerima 1234, 0664, 0x1234 dan mungkin negatif. Bendera Boolean (dalam bentuk panjangnya) menerima 1, 0, t, f, true, false, TRUE, FALSE, True, False. Bendera durasi menerima input apa pun yang valid untuk time.ParseDuration.
Dimungkinkan untuk menetapkan 'fungsi normalisasi' nama bendera khusus. Hal ini memungkinkan nama bendera untuk dimutasi baik ketika dibuat dalam kode dan ketika digunakan pada baris perintah ke beberapa bentuk 'dinormalisasi'. Bentuk 'dinormalisasi' digunakan untuk perbandingan. Berikut dua contoh penggunaan fungsi normalisasi khusus.
Contoh #1 : Anda ingin -, _, dan . dalam bendera untuk membandingkan hal yang sama. alias --bendera-saya == --bendera_saya == --bendera saya
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 )
Contoh #2 : Anda ingin membuat alias dua bendera. alias --nama-bendera-lama == --nama-bendera-baru
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 )
Dimungkinkan untuk tidak lagi menggunakan suatu bendera, atau hanya singkatannya saja. Penghentian penggunaan tanda/singkatan akan menyembunyikannya dari teks bantuan dan mencetak pesan penggunaan ketika tanda/singkatan yang tidak digunakan lagi digunakan.
Contoh #1 : Anda ingin menghentikan penggunaan flag bernama "badflag" serta memberi tahu pengguna flag apa yang harus mereka gunakan.
// deprecate a flag by specifying its name and a usage message
flags . MarkDeprecated ( "badflag" , "please use --good-flag instead" )
Ini menyembunyikan "badflag" dari teks bantuan, dan mencetak Flag --badflag has been deprecated, please use --good-flag instead
ketika "badflag" digunakan.
Contoh #2 : Anda ingin mempertahankan nama bendera "noshorthandflag" namun tidak lagi menggunakan nama pendeknya "n".
// deprecate a flag shorthand by specifying its flag name and a usage message
flags . MarkShorthandDeprecated ( "noshorthandflag" , "please use --noshorthandflag only" )
Ini menyembunyikan nama pendek "n" dari teks bantuan, dan mencetak Flag shorthand -n has been deprecated, please use --noshorthandflag only
ketika singkatan "n" digunakan.
Perhatikan bahwa pesan penggunaan sangat penting di sini, dan tidak boleh kosong.
Bendera dapat ditandai sebagai tersembunyi, artinya bendera akan tetap berfungsi seperti biasa, namun tidak akan muncul dalam teks penggunaan/bantuan.
Contoh : Anda memiliki bendera bernama "secretFlag" yang Anda perlukan hanya untuk penggunaan internal dan tidak ingin bendera tersebut muncul di teks bantuan, atau agar teks penggunaannya tersedia.
// hide a flag by specifying its name
flags . MarkHidden ( "secretFlag" )
pflag
memungkinkan Anda menonaktifkan penyortiran tanda untuk bantuan dan pesan penggunaan.
Contoh :
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 ()
Keluaran :
-v, --verbose verbose output
--coolflag string it's really cool flag (default "yeaah")
--usefulflag int sometimes it's very useful (default 777)
Untuk mendukung flag yang ditentukan menggunakan paket flag
Go, flag tersebut harus ditambahkan ke flagset pflag
. Hal ini biasanya diperlukan untuk mendukung flag yang ditentukan oleh dependensi pihak ketiga (misalnya golang/glog
).
Contoh : Anda ingin menambahkan flag Go ke flagset CommandLine
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 ()
}
Anda dapat melihat dokumentasi referensi lengkap paket pflag di godoc.org, atau melalui sistem dokumentasi standar go dengan menjalankan godoc -http=:6060
dan menjelajah ke http://localhost:6060/pkg/github.com/spf13/pflag setelah instalasi.