Set Bendera Bebas dalam GoLang
Dokumentasi Go untuk pakej bendera menyatakan bahawa ia membenarkan definisi set bendera bebas, sesuai untuk melaksanakan subperintah dalam antara muka baris arahan. Walau bagaimanapun, persoalan timbul tentang cara untuk mencapai fungsi ini.
Dalam senario di mana dua objek FlagSet ditakrifkan, menghuraikan satu boleh mengakibatkan ralat dan amaran jika baris arahan mengandungi bendera yang ditujukan untuk yang lain. Contoh berikut menggambarkan isu ini:
f1 := flag.NewFlagSet("f1", flag.ContinueOnError) apply := f1.Bool("apply", false, "") silent := f1.Bool("silent", false, "") if err := f1.Parse(os.Args[1:]); err == nil { fmt.Println(*apply, *silent) } f2 := flag.NewFlagSet("f2", flag.ContinueOnError) reset := f2.Bool("reset", false, "") if err := f2.Parse(os.Args[1:]); err == nil { fmt.Println(*reset) }
Kod ini menghasilkan amaran apabila cuba melaksanakan cmd -apply atau cmd -reset. Matlamatnya adalah untuk mengekalkan objek FlagSet yang berasingan, memastikan bahawa -silent hanya berfungsi untuk -apply.
Penyelesaian terletak pada membezakan subperintah dan kemudian memanggil Parse pada FlagSet yang sesuai. Kod yang disemak:
f1 := flag.NewFlagSet("f1", flag.ContinueOnError) silent := f1.Bool("silent", false, "") f2 := flag.NewFlagSet("f2", flag.ContinueOnError) loud := f2.Bool("loud", false, "") switch os.Args[1] { case "apply": if err := f1.Parse(os.Args[2:]); err == nil { fmt.Println("apply", *silent) } case "reset": if err := f2.Parse(os.Args[2:]); err == nil { fmt.Println("reset", *loud) } }
Dengan pendekatan ini, hanya FlagSet yang berkaitan akan dihuraikan berdasarkan subperintah yang ditentukan, memastikan tingkah laku yang diingini.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Set Bendera Bebas untuk Subperintah dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!