Go 结构体struct浅复制的坑 - 指针引用

在 Go 中没有定义不可变结构的方法:
struct 字段是可变的,const 关键字不适用于它们。
Go 通过简单的赋值就可以轻松地复制整个struct,因此,我们可能认为,通过值传递参数来保证不变性,只需要付出复制的代价。

然而,它不复制指针引用的值。而且由于内置的集合(map、slice 和 array)是引用和可变的,复制包含其中任意一项的 struct 只是复制了指向底层的指针。

下面的例子说明了这个问题:

type S struct {
    
    
	A string
	B []string
}

func main() {
    
    
	x := S{
    
    "x-A", []string{
    
    "x-B"}}
	y := x // 复制 struct
	y.A = "y-A"
	y.B[0] = "y-B"

	fmt.Println(x, y)
	// 输出 "{x-A [y-B]} {y-A [y-B]}" -- x 被修改!
}

所以你必须非常小心,如果你通过值传递参数,不要认定它就是不变的。

猜你喜欢

转载自blog.csdn.net/QiuHaoqian/article/details/108996524