Heim  >  Artikel  >  Backend-Entwicklung  >  Los: Das Anhängen des zweiten Elements ändert das erste Element

Los: Das Anhängen des zweiten Elements ändert das erste Element

PHPz
PHPznach vorne
2024-02-06 11:30:03592Durchsuche

Los: Das Anhängen des zweiten Elements ändert das erste Element

Frageninhalt

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.


Richtige Antwort


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.

Scheibe

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.

Array

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen