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

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

Golang 切片引用混淆

Golang 切片引用混淆

Go
月關寶盒 2023-05-22 17:10:50
package mainimport (    "fmt")func main() {    values := make([]int, 0, 100)    val := make([][]int, 2)    for i:=0; i<2; i++ {        values = values[:0]        for j:=0; j<2; j++ {            values = append(values, i+j)        }        val[i] = values        fmt.Println(values, val) //    }    fmt.Println(val)}https://play.golang.org/p/5x60VfDXbFw附加切片時,val 應該是 [[0, 1], [1, 2]],但得到的是 [[1,2], [1,2]]
查看完整描述

2 回答

?
慕尼黑5688855

TA貢獻1848條經驗 獲得超2個贊

發生這種情況是因為切片val包含指向其子切片的指針,而不是子切片本身。在您的代碼中,您最初放置了一個指向valuesin positions的指針val[0]。然后你修改values然后設置一個指向valuesin 的指針val[1]。但是val[0]和都val[1]指向相同的基礎對象 ( values),該對象已被修改。


您可以通過在外循環的每次迭代中創建一個新values切片來解決此問題,這樣每個子切片都val將是不同的切片。


例如:


func main() {

    val := make([][]int, 2)

    for i:=0; i<2; i++ {

        values := make([]int, 0, 100)

        for j:=0; j<2; j++ {

            values = append(values, i+j)

        }

        val[i] = values

        fmt.Println(values, val) //

    }

    fmt.Println(val)

}

輸出自fmt.Println:


[0 1] [[0 1] []]    // values, val

[1 2] [[0 1] [1 2]] // values, val

[[0 1] [1 2]]       // val


查看完整回答
反對 回復 2023-05-22
?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

您應該在 for 循環中初始化值,values = []int{}


代碼如下:


package main


import (

    "fmt"

)


func main() {

    var (

        valLength = 2

    )

    val := make([][]int, valLength)

    for i := 0; i < valLength; i++ {

        values := []int{}

        for j := 0; j < 2; j++ {

            values = append(values, i+j)

        }

        val[i] = values

        fmt.Println(values, val) //

    }

    fmt.Println(val)

}

而且您只需更改變量valLength即可獲得所需的任何長度的切片。


查看完整回答
反對 回復 2023-05-22
  • 2 回答
  • 0 關注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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