Modül dersleri (1/5)
Gelişmiş 'fmt'
fmt paketi Go'daki tüm metinsel G/Ç'lere açılan kapıdır. Bunu iyi bilmek, okunabilir günlükler yazmak, bilgilendirici hatalar yazmak ve harici kütüphanelere başvurmadan değerleri deyimsel olarak biçimlendirmek anlamına gelir.
Dört aile
fmt önekle ayırt edilen dört ailedeki işlevleri gösterir:
Print*→os.Stdout(Print,Println,Printf) öğesine yazar.Fprint*→ herhangi birio.Writer(Fprintln(os.Stderr, ...),Fprintf(file, ...)) öğesine yazar.Sprint*→ yazdırmadan bir dize döndürür (Sprintf,Sprintln).Errorf→ biçimlendirilmiş birerroroluşturur.
fmt.Println("hello") // stdout
fmt.Fprintln(os.Stderr, "boom") // stderr
s := fmt.Sprintf("[%d]", 42) // "[42]"
err := fmt.Errorf("parse %q: %w", in, base) // wrapped errorPrint ve Println arasındaki fark yalnızca bağımsız değişkenler ve sondaki yeni satır arasındaki boşluk'tur: Println her zaman \n ekler, Print eklemez, Printf biçimi izler.
Ana fiiller
| Fiil | Ne işe yarar |
|---|---|
%v | Varsayılan değer (uygulandıysa String() öğesini çağırır). |
%+v | alan adlarıyla yapı. |
%#v | Söz dizimine git (hata ayıklama ve anlık görüntüler için kullanışlıdır). |
%T | Değerin dinamik türü. |
%d | 10 tabanındaki tamsayı. |
%b %o %x %X | İkili, sekizli, onaltılı (küçük harf/büyük harf). |
%f %e %g | Kayan nokta: sabit, üstel, kompakt. |
%s | Dize (veya error/Stringer). |
%q | Go tarzı alıntılanan dize (kaçışlar dahil). |
%c | Unicode karakter (rune). |
%p | Onaltılı işaretçi. |
%w | Hata sarma (yalnızca Errorf içinde). |
type Point struct{ X, Y int }
p := Point{1, 2}
fmt.Printf("%v\n", p) // {1 2}
fmt.Printf("%+v\n", p) // {X:1 Y:2}
fmt.Printf("%#v\n", p) // main.Point{X:1, Y:2}
fmt.Printf("%T\n", p) // main.PointGenişlik, hassasiyet, bayraklar
Sayısal ve dize fiiller genişlik ve kesinlik değerlerini kabul eder:
%6d→ minimum genişlik 6, boşluklarla birlikte sol dolgu.%-6d→ genişlik 6, sağ dolgu (-işareti).%06d→ genişlik 6,0ile doldurma (0işareti).%.2f→ hassas 2 ondalık basamak.%8.2f→ genişlik 8, hassasiyet 2.
fmt.Printf("|%6d|\n", 42) // | 42|
fmt.Printf("|%-6d|\n", 42) // |42 |
fmt.Printf("|%06d|\n", 42) // |000042|
fmt.Printf("|%8.2f|\n", 3.14)// | 3.14|Hizalanmış tablolar için, metin sütunları için sabit genişlik + %-...s, text/tabwriter'ye geçmeden önce en basit kalıptır.
%w ve hata sarma
%w özeldir: yalnızca fmt.Errorf içinde çalışır ve zincirdeki orijinal hatayı korur, böylece errors.Is ve errors.As bunu yürütebilir.
if _, err := os.Open(path); err != nil {
return fmt.Errorf("read config %q: %w", path, err)
}%w yerine %v kullanmak hata mesajını yazdırır ancak zinciri bozar: paket açma yok, errors.Is yok. Kural: Arayanın hatanın türünü veya kimliğini ayırt edebilmesini istiyorsanız, %w kullanın (Errorf başına yalnızca bir tane).
Egzersizler
'[42]' dizesini 42 tam sayısından biçimlendirmek için fmt.Sprintf'i kullanın, ardından yazdırın.
3 denemeden sonra çözüm mevcut
p yapısını %+v fiiliyle birlikte yazdırın (alan adlarını içermelidir).
3 denemeden sonra çözüm mevcut
Fmt.Errorf'ta kullanılan hangi fiil, hatalara karşı hata zincirini korur.Is/As?
err := fmt.Errorf("read %q: ???", path, base)