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
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), YALNIZCAswitchiçinde geçerli olan özel bir sözdizimidir.v := ..., değeri geçerli vakanın türüyle bağlar:case intiçinde,v,inttürüne sahiptir.defaultdiğer tüm türleri yakalar; oradavorijinal arayüzün tipine sahiptir.case nilarayüzü sıfır dinamik türle eşleştirir.
"İsimsiz" vaka
Yazılan değere ihtiyacınız yoksa v öğesini atlayabilirsiniz:
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
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
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
Dinamik türe bağlı olarak 'int', 'string' veya 'altro'yu döndüren açıklama(i arayüz{}) dizesini uygulayın.
İpucu göster
Sözdizimi: `switch i.(type) { case T: ... default: ... }'.
3 denemeden sonra çözüm mevcut
v := i.(type) kullanan ve int için %d, string için %s ile yazdıran printVal(i arayüzü{}) yazın.
İpucu göster
'case int' içinde v'nin türü int'dir (bunu Printf'e iletebilirsiniz).
3 denemeden sonra çözüm mevcut
Hangi sözdizimi bir tür anahtarını başlatır?
switch ??? {
case int: ...
}Özet
switch v := i.(type) { case T: ... }: dinamik türe göre ayrım yapar.- Tek tip bir vakanın içinde,
vvakanın tipine sahiptir. case T1, T2:vorijinal arayüzün türünü korur.- İşlenmeyen vakalar için
default; Sıfır arayüz içincase nil. - Tip anahtarlarda
fallthroughyok. - 1 tür → iddia türü; 2+ tip → tip anahtar.