Ana içeriğe geç
Modül 6 · Ders 2 ders 5Kurstaki 27/50~10 min
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

Go
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:

FormuBaşarıBaşarısızlık
v := i.(T)v = T türünün değeripanik çalışma zamanında
v, ok := i.(T)v=..., ok=truev = T'nin sıfır değeri, ok=false

"Virgül tamam" formu: en güvenli

Go
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:

Go
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:

Go
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 ok ile tür iddiası.
  • 2'den fazla olası tür, birden fazla dal üzerinden gönderim: tür anahtarı (sonraki ders).

Deneyin

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

i'den bir dize çıkarmak için virgül ok desenini kullanın.

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

Sözdizimi: `v, tamam := i.(T)`.

3 denemeden sonra çözüm mevcut

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

İnt'ye virgül olmadan iddiayı yazın tamam (i'nin bir int içerdiğini varsayalım).

Düzenleyici yükleniyor…
İ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

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

Eğer i bir int içeriyorsa `s := i.(string)` ile ne olur?

Go
var i interface{} = 42
s := i.(string)
Cevap seçenekleri

Ö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").
  • T ve *T iddia için farklı türlerdir.
  • 1 tür → iddia; 2+ tip → tip anahtar.