用于范围指针的Golang

用于范围指针的Golang,go,Go,我是刚来Golang的新手,最近遇到了与此问题相同的问题: 因此,我想知道在for range循环中,在该循环范围之外的任何地方使用对象副本是否根本不合适,比如将其传递给单独的函数、附加它(如问题中所述),等等 如果您计划对对象进行变异,将其添加到循环范围之外的列表中,等等,那么访问这样的对象几乎总是更合适的,因为在下一个循环中,您添加的指针将发生更改 for index := range myList { doSomething(&myList[index]) } 您主要需要

我是刚来Golang的新手,最近遇到了与此问题相同的问题:

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

如果您计划对对象进行变异,将其添加到循环范围之外的列表中,等等,那么访问这样的对象几乎总是更合适的,因为在下一个循环中,您添加的指针将发生更改

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

您主要需要记住,Go是通过值传递的。如果您完全可以使用副本,充分理解突变不会反映,并且大型结构的副本可能会很昂贵,那么传递副本或指针是完全有道理的

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


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

您主要需要记住Go是按值传递的。如果您完全可以使用副本,充分理解突变不会反映,并且大型结构的副本可能会很昂贵,那么传递副本或指针是完全有道理的

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

在封面下,
slice
抽象了一个数组,但它仅仅是一个结构,称为slice头,带有指向数组的指针。当您传递一个切片时,头是通过值传递的,但是内容基本上由3个整数组成,所以复制它并不昂贵。这就是使用append时必须重新分配变量以使其保持不变的原因,例如
s=append(s,value)
。您可以通过引用在代码中传递一个片段,但这样做并不是惯用的方式