Rumah >pembangunan bahagian belakang >Golang >Pergi: Menambah item kedua menukar item pertama

Pergi: Menambah item kedua menukar item pertama

PHPz
PHPzke hadapan
2024-02-06 11:30:03640semak imbas

Pergi: Menambah item kedua menukar item pertama

Kandungan soalan

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.


Jawapan betul


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 .

Hiris

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.

Susunan

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam