Maison  >  Article  >  développement back-end  >  Aller : l'ajout du deuxième élément modifie le premier élément

Aller : l'ajout du deuxième élément modifie le premier élément

PHPz
PHPzavant
2024-02-06 11:30:03589parcourir

Aller : lajout du deuxième élément modifie le premier élément

Contenu de la question

Je ne sais pas quoi dire, il suffit de regarder le code et le résultat. 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)
}

Sortie :

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>

Regardez les chaînes people 0 et people 1 dans la sortie. J'utilise append pour fusionner buf 0 et buf 1, donc la chaîne people 1 dans la sortie devrait ressembler à ceci : [[{Alice A1} {Bob A2}]] [{Clark B1} {Davis B2}], c'est-à-dire que le premier élément du tableau devient l'élément inséré, même si cela ne devrait pas être le cas. Quelle pourrait en être la cause et comment y remédier ?

Je n'ai essayé aucun correctif car je n'ai trouvé aucun problème dans le code.


Bonne réponse


Bien que je sois d'accord avec les commentaires des autres selon lesquels la solution consiste à créer buf 变量移动到 for 循环内,但我也相信这种混乱源于 buf une tranche, peut-être que l'OP ne sait pas comment fonctionne le découpage. Les tranches sont différentes des tableaux, comme décrit dans Go Slices : utilisation et composants internes .

Tranche

Phrases clés pour citer la source :

Dans cet esprit, jetez un œil à l'exemple simplifié suivant :

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)
}

Sortie : [[2] [2] [2]]

C'est le comportement que l'OP a observé dans son exemple. Puisque les tranches sont des pointeurs vers des tableaux, buf doit être déclaré dans la boucle for afin que chaque itération ajoute une instance différente.

Voyons maintenant ce qui se passe si nous effectuons la même opération sur un tableau.

Tableau

Phrases clés pour citer la source :

Regardons maintenant un exemple qui montre une copie constituée du contenu d'un tableau lors de sa transmission (c'est-à-dire lors de sa transmission à 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)
}

Sortie : [[0] [1] [2]]

Maintenant, bien que la même variable buf soit utilisée dans la boucle for, toutes les valeurs sont différentes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer