亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Go 中處理切片的副本?

如何在 Go 中處理切片的副本?

Go
胡說叔叔 2023-03-21 15:56:37
mapArray 是 float32 的二維切片。我復制了它,這樣我就可以在不修改 mapArray 的情況下處理副本。然而,事實并非如此。Origin為modifies賦值mapArray。origins := it.Empty2DArray(len(mapArray))copy(origins, mapArray)origins[5][5] = -1這樣做mapArray[5][5]會使 -1 而不是其原始值。我如何制作切片的真正獨立副本?謝謝。編輯:// Empty2DArray returns a zeroed 2D array.func Empty2DArray(arraySize int) [][]float32 {    emptyArray := make([][]float32, arraySize)    for y := 0; y < arraySize; y++ {        row := make([]float32, arraySize)        for x := 0; x < arraySize; x++ {            row[x] = 0        }        emptyArray[y] = row    }    return emptyArray}
查看完整描述

1 回答

?
慕村9548890

TA貢獻1884條經驗 獲得超4個贊

二維切片是切片的切片。在您的函數中,您分配一個切片來保存其他切片,然后為每個切片分配內存來保存該行數據。要復制它,您需要復制所有這些數據行以及整個切片。

當你說 時copy(origins, mapArray),你真正做的是復制一份指向原始數據的指針。但是,您不復制原始數據。

我建議不要使用嵌套的 for 循環來復制子切片,而是只使用一維切片并創建包裝函數來對其進行索引。這樣內存效率更高,您可以使用內置的copy.

這是我會做的示例


package main


import "fmt"


type squareMat struct {

    size int

    data []float32

}


func newSquareMat(size int) *squareMat {

    return &squareMat{

        size: size,

        data: make([]float32, size*size),

    }

}


func (s *squareMat) get(i, j int) float32 {

    return s.data[i+j*s.size]

}


func (s *squareMat) set(i, j int, to float32) {

    s.data[i+j*s.size] = to

}


func (s *squareMat) copy() *squareMat {

    c := newSquareMat(s.size)

    copy(c.data, s.data)

    return c

}


func main() {

    m := newSquareMat(5)

    m.set(2, 3, 1.5)

    n := m.copy()

    n.set(2, 3, 99)

    fmt.Println(m.get(2, 3))

    fmt.Println(n.get(2, 3))

}

如果你堅持使用 2D float32 數組,這里是復制它的方法


package main


import "fmt"


func copy2D(x [][]float32) [][]float32 {

    c := make([][]float32, len(x))

    for i := range c {

        c[i] = make([]float32, len(x[i]))

        copy(c[i], x[i])

    }

    return c

}


func main() {

    a := [][]float32{

        []float32{1, 2, 3},

        []float32{4, 5, 6},

        []float32{7, 8, 9},

    }

    b := copy2D(a)

    b[1][1] = 99

    fmt.Println(a)

    fmt.Println(b)

}


查看完整回答
反對 回復 2023-03-21
  • 1 回答
  • 0 關注
  • 79 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號