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
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
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 (
errorile 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
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 ERRString() 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
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
(X,Y) değerini döndürecek şekilde String() öğesini Noktaya uygulayın.
İpucu göster
Alanları biçimlendirmek için 'fmt.Sprintf'i kullanın.
3 denemeden sonra çözüm mevcut
String()'i Status (int) türüne uygulayın: 0 → 'OK', 1 → 'WARN', aksi halde → 'ERR'.
İpucu göster
Alıcının değerini açın; bir varsayılan belirtmeyi unutmayın.
3 denemeden sonra çözüm mevcut
Yöntemin fmt.Stringer'ı karşılaması için hangi imzanın olması gerekir?
func (x T) ??? {}Ö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 aslatüzerindenString()(özyineleme) içerisinde aramayın.- Kural:
String()için değer alıcısı (mutasyon yok, "yöntem seti sürprizlerini" önler).