Modül dersleri (2/5)
Onay yazın
tip iddiası somut türü bir arayüz değerinden çıkarır.
interface{} (veya "yüksek" bir arayüze) sahip olduğunuzda buna ihtiyacınız vardır.
alanlara erişmek için onu özel bir tür olarak ele almanız gerekir veya
Arayüzde bulunmayan yöntemler.
Sözdizimi
var i interface{} = "ciao"
s := i.(string) // "panic" form: panics if it's not a string
s, ok := i.(string) // "comma ok" form: ok = false if it's not a stringİki biçim, iki anlam:
| Formu | Başarı | Başarısızlık |
|---|---|---|
v := i.(T) | v = T türünün değeri | panik çalışma zamanında |
v, ok := i.(T) | v=..., ok=true | v = T'nin sıfır değeri, ok=false |
"Virgül tamam" formu: en güvenli
var i interface{} = 42
if s, ok := i.(string); ok {
fmt.Println("è stringa:", s)
} else {
fmt.Println("non è stringa, ignoro")
}ok "yanlış tür" durumunu paniğe kapılmadan halletmenizi sağlar. Bu
vakaların büyük çoğunluğunda deyimsel kalıp.
Bir arayüze yönelik iddia
İddia yalnızca somut türler üzerinde değil aynı zamanda diğer türler üzerinde de işe yarar. arayüzler:
type Closer interface { Close() error }
func tryClose(x interface{}) {
if c, ok := x.(Closer); ok {
c.Close()
}
}Standart kütüphanede çok yaygın bir kalıp: "eğer benim girişimim de
bir io.Closer, sonunda Kapat'ı çağırın".
İşaretçiler ve değerler üzerine iddia
İddianın dinamik türle TAM OLARAK eşleşmesi gerekir:
type Cat struct{}
func (c *Cat) Meow() {}
var a interface{} = &Cat{}
c1, ok := a.(*Cat) // ok = true
c2, ok := a.(Cat) // ok = false: it holds *Cat, not Cat*Cat ve Cat tür sistemi için farklı türlerdir.
Onay ve tür anahtarı ne zaman kullanılmalı?
- Yalnızca 1 olası tür, "özellik algılama" kontrolü (örneğin, isteğe bağlı bir arayüze yayın):
comma okile tür iddiası. - 2'den fazla olası tür, birden fazla dal üzerinden gönderim: tür anahtarı (sonraki ders).
Deneyin
i'den bir dize çıkarmak için virgül ok desenini kullanın.
İpucu göster
Sözdizimi: `v, tamam := i.(T)`.
3 denemeden sonra çözüm mevcut
İnt'ye virgül olmadan iddiayı yazın tamam (i'nin bir int içerdiğini varsayalım).
İpucu göster
'tamam' olmadan türün kesin olduğunu varsayarsınız; aksi takdirde panik yapın.
3 denemeden sonra çözüm mevcut
Eğer i bir int içeriyorsa `s := i.(string)` ile ne olur?
var i interface{} = 42
s := i.(string)Özet
v := i.(T): dinamik tip ≠ T ise panik yapın.v, ok := i.(T): güvenli model,ok'yi kontrol edin.- Başka bir arayüze karşı da çalışır ("özellik algılama").
Tve*Tiddia için farklı türlerdir.- 1 tür → iddia; 2+ tip → tip anahtar.