Bagaimana untuk melakukan lelaran bersarang

WBOY
Lepaskan: 2024-02-14 16:50:09
ke hadapan
771 orang telah melayarinya

Bagaimana untuk melakukan lelaran bersarang

editor php Youzi akan memperkenalkan anda cara melakukan lelaran bersarang. Lelaran bersarang ialah teknik menggunakan gelung lain dalam gelung, yang membantu kami menangani struktur data yang kompleks atau tatasusunan berbilang dimensi. Apabila melakukan lelaran bersarang, kita perlu memberi perhatian kepada susunan dan syarat gelung untuk memastikan setiap elemen diakses dan diproses dengan betul. Artikel ini akan menerangkan prinsip dan penggunaan lelaran bersarang secara terperinci, dan menyediakan beberapa contoh praktikal untuk rujukan. Sama ada anda seorang pemula atau pembangun berpengalaman, artikel ini boleh membantu anda memahami dan menggunakan teknik lelaran bersarang dengan lebih baik. Mari kita meneroka bersama-sama!

Kandungan soalan

Saya sedang cuba membangunkan sambungan perisian lain yang menghantar permintaan kepada aplikasi yang ditulis dalam go. Dalam program go (yang sekarang saya akan panggil "program"), satu tujuan adalah untuk menukar fail json ke dalam format yang boleh diubah. Berikut ialah contoh format json yang saya gunakan:

{
  "name": "game-name",
  "tree": {
    "$classname": "datamodel",

    "replicatedstorage": {
      "$path": "src/replicatedstorage"
    },

    "serverscriptservice": {
      "$path": "src/serverscriptservice"
    },

    "replicatedfirst": {
      "$path": "src/replicatedfirst"
    },

    "serverstorage": {
      "$path": "src/serverstorage"
    }
  }
}
Salin selepas log masuk

Ideanya ialah:

  • Lelaran boleh dapat "nama"
  • Lelaran boleh mendapat "$classname"
  • Untuk semua keadaan yang diindeks oleh "$path", nama folder dalam induk src 文件夹下创建一个文件夹,其中包含父地图的索引。例如,replicatedstorage 是路径为 src/replicatedstorage akan ditemui

Berikut adalah fungsi pengendali untuk melakukan ini:

func process(in interface{}) {
v := reflect.ValueOf(in)

    if v.Kind() == reflect.Map {
        for _, key := range v.MapKeys() {
            strct := v.MapIndex(key)
    
            index := key.Interface()
            value := reflect.ValueOf(strct.Interface())
    
            if index == "tree" {
                for _, treeKey := range value.MapKeys() {
                    treeIndex := treeKey.Interface()
    
                    fmt.Println("KEY")
                    fmt.Println(treeIndex)
    
                    if treeIndex != "$className" {
                        fmt.Println("bug")
                        fmt.Println(treeKey)
    
                        a := key.MapIndex(value) // panic serving ...: reflect: call of reflect.Value.MapIndex on string Value
                        b := reflect.ValueOf(a.Interface())
    
                        for _, key2 := range b.MapKeys() {
                            index2 := key2.Interface()
                            value2 := reflect.ValueOf(key2.Interface())
    
                            fmt.Println(index2)
                            fmt.Println(value2)
                        }
                    }
                }
            }
        }
    }

}
Salin selepas log masuk

Komen menunjukkan lokasi dan kandungan yang salah. Satu perkara yang saya juga ingin lakukan ialah tidak perlu menyusun gelung untuk, kerana itu kod yang sangat buruk.

Penyelesaian

Pendekatan yang biasa adalah untuk membongkar jenis go yang sepadan dengan struktur data. Masalahnya di sini ialah pokok itu tidak boleh dengan mudah diwakili sebagai jenis pergi (ia mempunyai medan $classname bagi jenis rentetan, tetapi sebaliknya serupa dengan peta dengan nilai objek yang mengandungi medan $path).

Mari teruskan unmarshalling ke dalam interface{} seperti yang telah anda lakukan.

Gunakan jenis penegasan dan bukannya pakej refleksi. Gunakan Indeks Peta untuk mencari nilai dan bukannya menggelung kekunci dan mencari padanan.

func process(in interface{}) error {
    top, ok := in.(map[string]interface{})
    if !ok {
        return errors.New("expected object at top level")
    }
    tree, ok := top["tree"].(map[string]interface{})
    if !ok {
        return errors.New(".tree not found")
    }
    name, ok := top["name"]
    if !ok {
        return errors.New(".name not found")
    }
    className, ok := tree["$className"].(string)
    if !ok {
        return errors.New(".tree.$className not found")
    }
    for k, v := range tree {
        thing, ok := v.(map[string]interface{})
        if !ok {
            continue
        }
        path, ok := thing["$path"].(string)
        if !ok {
            continue
        }
        fmt.Println(name, className, k, path)
    }
    return nil
}
Salin selepas log masuk

https://www.php.cn/link/8642785813491d703d517ddd00944054

Atas ialah kandungan terperinci Bagaimana untuk melakukan lelaran bersarang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan