Ana içeriğe geç
Modül 8 · Ders 1 ders 5Kurstaki 36/50~10 min
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 bir io.Writer (Fprintln(os.Stderr, ...), Fprintf(file, ...)) öğesine yazar.
  • Sprint* → yazdırmadan bir dize döndürür (Sprintf, Sprintln).
  • Errorf → biçimlendirilmiş bir error oluşturur.
Go
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 error

Print 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

FiilNe işe yarar
%vVarsayılan değer (uygulandıysa String() öğesini çağırır).
%+valan adlarıyla yapı.
%#vSöz dizimine git (hata ayıklama ve anlık görüntüler için kullanışlıdır).
%TDeğerin dinamik türü.
%d10 tabanındaki tamsayı.
%b %o %x %Xİkili, sekizli, onaltılı (küçük harf/büyük harf).
%f %e %gKayan nokta: sabit, üstel, kompakt.
%sDize (veya error/Stringer).
%qGo tarzı alıntılanan dize (kaçışlar dahil).
%cUnicode karakter (rune).
%pOnaltılı işaretçi.
%wHata sarma (yalnızca Errorf içinde).
Go
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.Point

Geniş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, 0 ile doldurma (0 işareti).
  • %.2f → hassas 2 ondalık basamak.
  • %8.2f → genişlik 8, hassasiyet 2.
Go
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.

Go
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

Egzersiz#go.m8.l1.e1
Denemeler: 0Yükleniyor…

'[42]' dizesini 42 tam sayısından biçimlendirmek için fmt.Sprintf'i kullanın, ardından yazdırın.

Düzenleyici yükleniyor…

3 denemeden sonra çözüm mevcut

Egzersiz#go.m8.l1.e2
Denemeler: 0Yükleniyor…

p yapısını %+v fiiliyle birlikte yazdırın (alan adlarını içermelidir).

Düzenleyici yükleniyor…

3 denemeden sonra çözüm mevcut

Quiz#go.m8.l1.e3
Hazır

Fmt.Errorf'ta kullanılan hangi fiil, hatalara karşı hata zincirini korur.Is/As?

Go
err := fmt.Errorf("read %q: ???", path, base)
Cevap seçenekleri