Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mengulangi Struktur Data Tidak Diketahui dalam Go?

Bagaimanakah Saya Boleh Mengulangi Struktur Data Tidak Diketahui dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-12-17 15:46:10494semak imbas

How Can I Iterate Over Unknown Data Structures in Go?

Membalas Struktur Data dalam Go Tanpa Mengetahui Jenis Tepat

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn