为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信