Ana içeriğe geç
Modül 6 · Ders 4 ders 5Kurstaki 29/50~10 min
Modül dersleri (4/5)

Stringer arayüzü

fmt.Stringer muhtemelen tüm dünyada en çok kullanılan standart arayüzdür. Go'nun standart kütüphanesi. Bu gücün mükemmel bir göstergesi küçük arayüzlerden oluşur.

Tanım

Go
type Stringer interface {
    String() string
}

Tek bir imza. String() string'yı tanımlayan herhangi bir tür aşağıdaki koşulları karşılar: o. Ve fmt bu arayüzü tanır: bir değer ilettiğinizde fmt.Print*, Stringer uyguluyorsa, String() sonucu Varsayılan gösterim yerine kullanılır.

Örnek

Go
type Point struct{ X, Y int }

func (p Point) String() string {
    return fmt.Sprintf("(%d,%d)", p.X, p.Y)
}

fmt.Println(Point{1, 2})              // (1,2)
fmt.Printf("%v %s\n", Point{3, 4}, Point{5, 6})
// (3,4) (5,6)

Aynı değer, %v, %s, Println'de özel biçimlendirmeyle yazdırılır, Sprint, log, vb. Hepsi yalnızca bir yöntem tanımlayarak.

Mantıklı olduğunda

  • Bir alanı modelleyen türler (kimlikler, kodlar, koordinatlar, numaralandırmalar).
  • İnsan tarafından okunabilir bir gösterimle ilgili hatalar (error ile ilgili bir sonraki derse bakın).
  • Sıklıkla oturum açtığınız ve sabit bir format istediğiniz türler.

Her şey için değil: eğer tür basitse ve varsayılan gösterim sorun değil, gürültü eklemeyin.

Enum türleri: iota ile ortak kalıp

Go
type Status int

const (
    OK Status = iota
    WARN
    ERR
)

func (s Status) String() string {
    switch s {
    case OK:   return "OK"
    case WARN: return "WARN"
    case ERR:  return "ERR"
    default:   return "UNKNOWN"
    }
}

fmt.Println(OK, WARN, ERR)   // OK WARN ERR

String() olmasaydı, fmt.Println(OK) 0 yazdırırdı. String() ile, sembolik adı yazdırır. stringer araç bu modeli otomatik olarak oluşturur.

Sonsuz özyinelemeye dikkat edin

Go
type T int
func (t T) String() string {
    return fmt.Sprintf("%d", int(t))  // OK: cast to int breaks the recursion
}

İşaretçi alıcısındaki Stringer

String() bir işaretçi alıcısına sahipse, yalnızca *T Stringer koşullarını karşılar. fmt.Println(t) (bir değer) ile Go, T yöntem kümesine bakar, bulamaz ve varsayılan biçimi kullanır. Bunu önlemek için değer alıcı genellikle String() için kullanılır (bu bir "görüntülemedir"; herhangi bir şeyi değiştirin).

Deneyin

Egzersiz#go.m6.l4.e1
Denemeler: 0Yükleniyor…

(X,Y) değerini döndürecek şekilde String() öğesini Noktaya uygulayın.

Düzenleyici yükleniyor…
İpucu göster

Alanları biçimlendirmek için 'fmt.Sprintf'i kullanın.

3 denemeden sonra çözüm mevcut

Egzersiz#go.m6.l4.e2
Denemeler: 0Yükleniyor…

String()'i Status (int) türüne uygulayın: 0 → 'OK', 1 → 'WARN', aksi halde → 'ERR'.

Düzenleyici yükleniyor…
İpucu göster

Alıcının değerini açın; bir varsayılan belirtmeyi unutmayın.

3 denemeden sonra çözüm mevcut

Quiz#go.m6.l4.e3
Hazır

Yöntemin fmt.Stringer'ı karşılaması için hangi imzanın olması gerekir?

Go
func (x T) ??? {}
Cevap seçenekleri

Özet

  • fmt.Stringer = interface { String() string }.
  • Bunu uygulamak, fmt.Print* tipinin nasıl temsil edildiğini değiştirir.
  • Numaralandırmalar (iota), etki alanı türleri, kodlar/tanımlayıcılar için deyimsel.
  • fmt.Sprintf("%s", t)'yi asla t üzerinden String() (özyineleme) içerisinde aramayın.
  • Kural: String() için değer alıcısı (mutasyon yok, "yöntem seti sürprizlerini" önler).