Saya tidak tahu nak cakap apa, cuma lihat pada kod dan output. Kod:
package main import ( "encoding/json" "fmt" ) type Human struct { N string `json:"n"` C string `json:"c"` } func funcname(jDL ...[]byte) { jDL_len := len(jDL) people := [][]Human{} var buf []Human var err error for i := 0; i < jDL_len; i++ { err = json.Unmarshal(jDL[i], &buf) fmt.Println("buf", i, buf) people = append(people, buf) fmt.Println("people", i, people) } jsoned, err := json.Marshal(people) fmt.Println("jsoned", string(jsoned)) fmt.Println("err", err) } func main() { i0 := []byte(`[ { "n": "Alice", "c": "A1" }, { "n": "Bob", "c": "A2" } ]`) i1 := []byte(`[ { "n": "Clark", "c": "B1" }, { "n": "Davis", "c": "B2" } ]`) funcname(i0, i1) }
Keluaran:
buf 0 [{Alice A1} {Bob A2}] people 0 [[{Alice A1} {Bob A2}]] buf 1 [{Clark B1} {Davis B2}] people 1 [[{Clark B1} {Davis B2}] [{Clark B1} {Davis B2}]] jsoned [[{"n":"Clark","c":"B1"},{"n":"Davis","c":"B2"}],[{"n":"Clark","c":"B1"},{"n":"Davis","c":"B2"}]] err <nil>
Lihat orang 0 dan orang 1 rentetan dalam output. Saya menggunakan tambah untuk menggabungkan buf 0 dan buf 1, jadi rentetan orang 1 dalam output sepatutnya kelihatan seperti ini:
[[{Alice A1} {Bob A2}]] [{Clark B1} {Davis B2}]
, iaitu elemen pertama tatasusunan bertukar kepada elemen yang disisipkan, walaupun ini tidak sepatutnya berlaku. Apa yang boleh menjadi punca dan bagaimana untuk memperbaikinya?
Saya tidak mencuba sebarang pembetulan kerana saya tidak menemui sebarang isu dalam kod.
Walaupun saya bersetuju dengan komen orang lain bahawa penyelesaiannya adalah untuk membuat buf
变量移动到 for 循环内,但我也相信这种混乱源于 buf
sepotong, mungkin OP tidak tahu cara menghiris berfungsi. Slices berbeza daripada tatasusunan, seperti yang diterangkan dalam Go Slices: Penggunaan dan Dalaman .
Ayat kunci untuk memetik sumber:
Dengan ini, lihat contoh mudah berikut:
package main import "fmt" func main() { slice := [][]int{} buf := []int{0} // Slice for i := 0; i < 3; i++ { // Modifying the slice which is a pointer to an underlying array. buf[0] = i // Appending the slice (i.e. pointer). slice = append(slice, buf) } fmt.Println(slice) }
Output: [[2] [2] [2]]
Ini ialah tingkah laku yang diperhatikan oleh OP dalam contoh mereka. Memandangkan hirisan ialah penunjuk kepada tatasusunan, buf
perlu diisytiharkan di dalam gelung for supaya setiap lelaran menambahkan kejadian yang berbeza.
Sekarang mari kita lihat apa yang berlaku jika kita melakukan operasi yang sama pada tatasusunan.
Ayat kunci untuk memetik sumber:
Sekarang mari kita lihat contoh yang menunjukkan salinan yang terdiri daripada kandungan tatasusunan apabila menghantarnya (iaitu apabila menghantarnya ke append
):
package main import "fmt" func main() { slice := [][1]int{} buf := [1]int{} // Array for i := 0; i < 3; i++ { // Modifying the array. buf[0] = i // Appending a copy of the array. slice = append(slice, buf) } fmt.Println(slice) }
Output: [[0] [1] [2]]
Kini, walaupun pembolehubah buf
yang sama digunakan dalam gelung for, semua nilai adalah berbeza.
Atas ialah kandungan terperinci Pergi: Menambah item kedua menukar item pertama. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!