Subcommand
- Go kursu
- Orta seviye
- Ders 74/80
- 4 dk
Kendi subcommand yapını kurmayı öğrenirsin.
Alt komutlar
git commit, go build gibi araçlar alt komut kullanır. Standart kütüphaneyle her alt komut için ayrı bir flag.FlagSet kurulur ve os.Args[1]'e göre seçilir:
ekleCmd := flag.NewFlagSet("ekle", flag.ExitOnError)
ad := ekleCmd.String("ad", "", "görev adı")
listeCmd := flag.NewFlagSet("liste", flag.ExitOnError)
switch os.Args[1] {
case "ekle":
ekleCmd.Parse(os.Args[2:])
fmt.Println("eklendi:", *ad)
case "liste":
listeCmd.Parse(os.Args[2:])
default:
fmt.Fprintln(os.Stderr, "bilinmeyen komut:", os.Args[1])
os.Exit(2)
}Kütüphaneler
Çok sayıda alt komut, kabuk tamamlama ve iç içe komutlar gerekiyorsa spf13/cobra (kubectl, gh, hugo kullanır) ya da urfave/cli gibi kütüphaneler tercih edilir. Küçük araçlar için standart flag ve bir switch yeterlidir ve bağımlılık eklemez.
Uygulama Komut dağıtıcı
calistir(args []string) string yaz: args[0] "ekle" ise kendi FlagSet'iyle -ad seçeneğini ayrıştırıp "eklendi: " + ad, "liste" ise "liste boş", aksi halde "bilinmeyen komut" döndürsün. []string{"ekle", "-ad=süt"} ve []string{"sil"} ile çağırıp sonuçları yazdır.
Başlangıç kodu
package main
import (
"flag"
"fmt"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"flag"
"fmt"
)
func calistir(args []string) string {
switch args[0] {
case "ekle":
fs := flag.NewFlagSet("ekle", flag.ContinueOnError)
ad := fs.String("ad", "", "görev adı")
if err := fs.Parse(args[1:]); err != nil {
return err.Error()
}
return "eklendi: " + *ad
case "liste":
return "liste boş"
default:
return "bilinmeyen komut"
}
}
func main() {
fmt.Println(calistir([]string{"ekle", "-ad=süt"}))
fmt.Println(calistir([]string{"sil"}))
}Beklenen çıktı
eklendi: süt bilinmeyen komut
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Alt komutun FlagSet'ine neden <code>os.Args[2:]</code> verilir?
- [0] program adı, [1] alt komut adıdır; seçenekler ondan sonra başlar Doğru cevap
- Go zorunlu kıldığı için
- İlk iki argüman her zaman boştur
- Güvenlik için
Açıklama: os.Args[0] çalıştırılan program, os.Args[1] alt komuttur; alt komutun kendi seçenekleri dizinin geri kalanındadır.
2 Alt komut kümesi
ekleCmd := flag.____("ekle", flag.ExitOnError)
ekleCmd := flag.NewFlagSet("ekle", flag.ExitOnError)
Açıklama: NewFlagSet bir alt komuta ait bağımsız seçenek kümesi oluşturur.
3 os.Args
| Kavram | Anlamı |
|---|---|
os.Args[0] |
Program adı |
os.Args[1] |
Alt komut |
os.Args[2:] |
Alt komut seçenekleri |
default dalı |
Bilinmeyen komut |