在 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 被修改!
}
所以你必须非常小心,如果你通过值传递参数,不要认定它就是不变的。