Dalam bahasa Go, kita sering menghadapi situasi di mana kita perlu mengakses sifat subjenis dalam objek jenis induk. Ini mungkin kerana kami menggunakan struktur bersarang semasa mentakrifkan struktur. Walau bagaimanapun, oleh kerana tiada konsep warisan dalam bahasa Go, sifat subjenis tidak boleh diakses terus melalui objek jenis induk. Jadi, bagaimana untuk melaksanakan keperluan ini dalam Go? Di bawah, saya akan memperkenalkan anda kepada beberapa kaedah yang biasa digunakan.
Saya sedang mencipta storan fail. Saya cuba mencipta pelbagai jenis fail. Untuk mensimulasikan ini saya menggunakan kod:
<code>package main import ( "fmt" "time" ) type File interface{} type Audio struct { File Duration time.Duration } type Image struct { File Width uint Height uint } func main() { var files = map[string]File{ "1": Audio{ Duration: 14 * time.Second, }, "2": Image{ Height: 9989, Width: 1111, }, "3": Image{ Width: 1234, Height: 5678, }, } for k, v := range files { switch v.(type) { case Audio: fmt.Printf("%s: Audio %d seconds", k, v.Duration / time.Second) case Image: fmt.Printf("%s: Image %dx%d", k, v.Width, v.Height) } } } </code>
Saya menjangkakan output ini:
1: Audio 14 seconds 2: Image 1111x9989 3: Image 1234x5678
Tetapi pengkompil Go memberi saya ralat ini:
./main.go:38:44: v. Tempoh tidak ditentukan (jenis Fail tidak mempunyai medan atau kaedah Tempoh)
./main.go:40:39: v.Width is undefined (type File has no field or method Width)
./main.go:40:48: v.Ketinggian tidak ditentukan (jenis Fail tidak mempunyai medan atau kaedah Ketinggian)
Bagaimana untuk membetulkan ralat?
switch v := v.(type) {
akan mengisytiharkan v
baharu dengan jenis yang anda jangkakan.
Atas ialah kandungan terperinci Bagaimana untuk mengakses sifat subjenis dalam objek jenis induk dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!