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
Lepaskan: 2024-12-17 15:46:10
asal
487 orang telah melayarinya

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
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan