我正在尝试在Go中的for循环中设置引用。
我有以下代码(https://play.golang.org/p/knsVC2gMSCL):
package main
import (
"fmt"
)
type Person struct{ Name string }
func main() {
persons := []Person{
Person{
Name: "Sebastiaan",
},
Person{
Name: "Melle",
},
}
var sebastiaan *Person
for _, person := range persons {
if person.Name == "Sebastiaan" {
sebastiaan = &person
}
}
fmt.Printf("sebastiaan: %+v\n", sebastiaan)
}
我希望sebastiaan
变量具有Sebastiaan person的值,但是当我运行此代码时,我得到以下信息:sebastiaan: &{Name:Melle}
有人知道这怎么可能吗?
最佳答案
问题是您要设置对循环计数器的引用。
这意味着&person
引用将始终是数组中的最后一项。
您可以通过两种方式解决此问题。
复制循环计数器
您可以复制循环计数器,并设置对它的引用,如下所示:
if person.Name == "Sebastiaan" {
copy := person
sebastiaan = ©
}
不要使用引用您也可以通过不使用对循环计数器的引用来解决它。
您可以通过将
persons
数组更改为类似这样的指针来实现此目的:persons := []*Person{
&Person{
Name: "Sebastiaan",
},
&Person{
Name: "Melle",
},
}
然后此代码将按预期工作。if person.Name == "Sebastiaan" {
sebastiaan = person
}
关于go - 在for循环中进入引用设置了错误的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62929600/