CodeBlanks Logo Icon CodeBlanks

Subcommand

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

main.go
package main

import (
    "flag"
    "fmt"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
ekleCmd := flag.____("ekle", flag.ExitOnError)
Cevap
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

Orta seviye bölümündeki tüm dersler