Masalah:
Bagaimanakah kita boleh mengulang struktur data (tatasusunan atau peta) dalam Go tanpa mempunyai pengetahuan yang tepat tentangnya taip?
Percubaan Gagal:
Kod di bawah cuba lelaran pada antara muka yang mewakili sama ada peta atau tatasusunan dan melaksanakan fungsi pada setiap item, tetapi ia gagal kerana pemeriksaan jenis isu.
func DoTheThingToAllTheThings(data_interface interface{}) int { var numThings int switch data := data_interface.(type) { case map[interface{}]interface{}: numThings = len(data) // ... case []interface{}: numThings = len(data) // ... default: fmt.Println("uh oh!") } return numThings }
Penyelesaian:
Fungsi fmt.Printf("%vn", data_interface) menyediakan satu cara untuk mengulang struktur data tanpa menaip- pemutus.
func PrintData(data_interface interface{}) { fmt.Printf("%v\n", data_interface) }
Ini berfungsi kerana kata kerja %v dalam fmt.Printf menggunakan pantulan untuk menentukan jenis hujah dan cetak dengan sewajarnya.
Refleksi dalam Go:
Fungsi fmt.Printf secara dalaman menggunakan pakej reflect untuk memeriksa jenis hujah dan memutuskan cara memformatnya. Refleksi.ValueOf(arg) mengembalikan objek reflect.Value, yang mewakili nilai sebenar argumen dan reflect.TypeOf(arg) mengembalikan jenis nilai.
Contoh:
Kod berikut mencerminkan struktur Lembaga, kemudian menyusunnya semula menjadi pembolehubah baharu yang sama taip.
type Board struct { Tboard [9]string Player1 Player Player2 Player } func main() { myBoard := makeBoard() v := reflect.ValueOf(*myBoard) t := v.Type() var b2 Board b2 = v.Interface().(Board) fmt.Printf("v converted back to: %#v\n", b2) }
Nota:
Untuk menggunakan refleksi, jenis struktur data mesti dieksport, yang bermaksud ia mesti bermula dengan huruf besar.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengulangi Struktur Data Tidak Diketahui dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!