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

Tip anahtarı

Tür anahtarı birden fazla olası tür arasında ayrım yapar. arayüz değeri. Bu, comma ok genellemesidir. birden fazla vaka.

Sözdizimi

Go
func describe(i interface{}) string {
    switch v := i.(type) {
    case int:
        return fmt.Sprintf("int %d", v)
    case string:
        return fmt.Sprintf("string %q", v)
    case nil:
        return "nil"
    default:
        return fmt.Sprintf("altro tipo: %T", v)
    }
}
  • i.(type), YALNIZCA switch içinde geçerli olan özel bir sözdizimidir.
  • v := ..., değeri geçerli vakanın türüyle bağlar: case int içinde, v, int türüne sahiptir.
  • default diğer tüm türleri yakalar; orada v orijinal arayüzün tipine sahiptir.
  • case nil arayüzü sıfır dinamik türle eşleştirir.

"İsimsiz" vaka

Yazılan değere ihtiyacınız yoksa v öğesini atlayabilirsiniz:

Go
switch i.(type) {
case int:
    // you know it's an int, but you don't have a variable of that type
case string:
    // ...
}

Çalıştırmak yerine yalnızca türü ayırt etmeniz gerektiğinde kullanılan bir form değer üzerinde.

Aynı durumda birden fazla tür

Go
switch v := i.(type) {
case int, int64:
    // here v is still interface{}: the "common" type is just the interface
    fmt.Println("numero intero:", v)
case string:
    // here v is string
    fmt.Println("stringa:", v)
}

Tipik kullanım durumu: biçimlendirilmiş yazdırma

Go
func print(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.Printf("%d\n", v)
    case string:
        fmt.Printf("%s\n", v)
    case fmt.Stringer:
        fmt.Println(v.String())
    default:
        fmt.Printf("%v\n", v)
    }
}

fmt.Println kendisi, işlemleri gerçekleştirmek için dahili olarak bir tür anahtarı kullanır. standart formatlar.

Tip anahtarı ve yansıma

Bilinen birkaç tür için → anahtar yazın (hızlı, okunabilir). Bilinmeyen türlerin dinamik denetimi için → reflect paketi (daha fazlası güçlü ancak daha yavaş ve daha ayrıntılı).

Deneyin

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

Dinamik türe bağlı olarak 'int', 'string' veya 'altro'yu döndüren açıklama(i arayüz{}) dizesini uygulayın.

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

Sözdizimi: `switch i.(type) { case T: ... default: ... }'.

3 denemeden sonra çözüm mevcut

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

v := i.(type) kullanan ve int için %d, string için %s ile yazdıran printVal(i arayüzü{}) yazın.

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

'case int' içinde v'nin türü int'dir (bunu Printf'e iletebilirsiniz).

3 denemeden sonra çözüm mevcut

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

Hangi sözdizimi bir tür anahtarını başlatır?

Go
switch ??? {
  case int: ...
}
Cevap seçenekleri

Özet

  • switch v := i.(type) { case T: ... }: dinamik türe göre ayrım yapar.
  • Tek tip bir vakanın içinde, v vakanın tipine sahiptir.
  • case T1, T2: v orijinal arayüzün türünü korur.
  • İşlenmeyen vakalar için default; Sıfır arayüz için case nil.
  • Tip anahtarlarda fallthrough yok.
  • 1 tür → iddia türü; 2+ tip → tip anahtar.