Rumah > Artikel > pembangunan bahagian belakang > 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!
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" } } }
Ideanya ialah:
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) } } } } } } }
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.
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 }
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!