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.
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 .
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.
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!