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

Pergi: Menambah item kedua menukar item pertama

PHPz
Lepaskan: 2024-02-06 11:30:03
ke hadapan
637 orang telah melayarinya

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)
}
Salin selepas log masuk

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>
Salin selepas log masuk

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)
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan