go - 在for循环中进入引用设置了错误的引用

标签 go

我正在尝试在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 = &copy
}
不要使用引用
您也可以通过不使用对循环计数器的引用来解决它。
您可以通过将persons数组更改为类似这样的指针来实现此目的:
persons := []*Person{
    &Person{
        Name: "Sebastiaan",
    },
    &Person{
        Name: "Melle",
    },
}
然后此代码将按预期工作。
if person.Name == "Sebastiaan" {
    sebastiaan = person
}

关于go - 在for循环中进入引用设置了错误的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62929600/

相关文章:

arrays - Go:在循环中追加 byte slice

linux - 在 Go 中设置进程名称(如 `ps` 所示)

file - 在 Go 中使用相同的 *os.File 写入和读取文件

linux - 为什么os.OpenFile无法创建777文件

go - 我推迟一个函数返回函数,顺序是什么

mongodb - 如何在 golang 中获取 mongodb 的转储并恢复它

GOLang Scanf 错误

git - 尝试创建一个可以获取的 go.tools 本地仓库

Go goroutine 加锁和解锁

go - 如何为 gRPC TLS 连接设置 docker-compose 容器?