Heim >Backend-Entwicklung >Golang >Los: Das Anhängen des zweiten Elements ändert das erste Element
Ich weiß nicht, was ich sagen soll, schauen Sie sich einfach den Code und die Ausgabe an. Code:
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) }
Ausgabe:
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>
Sehen Sie sich die Zeichenfolgen „Person 0“ und „Person 1“ in der Ausgabe an. Ich verwende append, um buf 0 und buf 1 zusammenzuführen, daher sollte die Zeichenfolge „people 1“ in der Ausgabe so aussehen:
[[{Alice A1} {Bob A2}]] [{Clark B1} {Davis B2}]
, d. h. das erste Element des Arrays wird zum eingefügten Element, obwohl dies nicht der Fall sein sollte. Was könnte die Ursache sein und wie lässt sich das Problem beheben?
Ich habe keine Korrekturen versucht, da ich keine Probleme im Code gefunden habe.
Obwohl ich den Kommentaren anderer zustimme, dass die Lösung darin besteht, buf
变量移动到 for 循环内,但我也相信这种混乱源于 buf
ein Slice zu machen, weiß der OP vielleicht nicht, wie das Slicing funktioniert. Slices unterscheiden sich von Arrays, wie in Go Slices: Verwendung und Interna beschrieben.
Schlüsselsätze zum Zitieren der Quelle:
Schauen Sie sich vor diesem Hintergrund das folgende vereinfachte Beispiel an:
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) }
Ausgabe: [[2] [2] [2]]
Dies ist das Verhalten, das der OP in seinem Beispiel beobachtet hat. Da Slices Zeiger auf Arrays sind, muss buf
innerhalb der for-Schleife deklariert werden, damit bei jeder Iteration eine andere Instanz angehängt wird.
Jetzt wollen wir sehen, was passiert, wenn wir denselben Vorgang auf einem Array ausführen.
Schlüsselsätze zum Zitieren der Quelle:
Schauen wir uns nun ein Beispiel an, das eine Kopie zeigt, die aus dem Inhalt eines Arrays besteht, wenn es übergeben wird (d. h. wenn es an append
übergeben wird):
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) }
Ausgabe: [[0] [1] [2]]
Obwohl in der for-Schleife dieselbe buf
-Variable verwendet wird, sind alle Werte unterschiedlich.
Das obige ist der detaillierte Inhalt vonLos: Das Anhängen des zweiten Elements ändert das erste Element. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!