Golang用于范围指针

时间:2018-12-07 20:22:21

标签: go

我是Golang的新手,最近遇到了与该问题相同的问题:Strange golang "append" behavior

因此,我想知道在for range循环中,在该循环范围之外的任何地方使用对象副本是否根本不合适,例如将其传递给一个单独的函数,附加它(如问题),等等。

如果您打算对它进行突变,将其添加到该循环范围之外的列表中,等等,访问这样的对象几乎总是更合适吗,因为在下一个循环中,您添加的指针将发生变化?

for index := range myList {
    doSomething(&myList[index])
}

1 个答案:

答案 0 :(得分:3)

您最需要记住的是,Go是通过值传递如果您完全可以使用副本,并且完全了解突变不会反映出来,并且巨大结构的副本可能会非常昂贵,因此完全有理由通过副本或指针。

如果您需要进行修改,则可以按此处显示的方式通过引用传递,也可以将它们作为指针存储在切片中,例如以[]*MyStruct。实际上,这揭示了一种设计选择,他们在规范中专门选择了通过复制传递结构的方法。

在幕后,slice抽象了一个数组,但仅仅是一个结构,称为切片头,带有指向数组的指针。当您传递切片时,标头将通过传递,但是内容基本上由3个整数组成,因此复制它并不昂贵。这就是为什么在使用append使其永久存在时必须重新分配变量的原因,例如s = append(s, value)。您可以 通过引用在代码中传递一个切片,但这并不是惯用的Go。

相关问题