登录
首页 >  Golang >  Go问答

为循环中的Go引用设置了无效引用

来源:stackoverflow

时间:2024-03-02 09:42:26 435浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《为循环中的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 = ©
}

不要使用引用

您还可以通过不使用循环计数器的引用来修复它。 您可以通过将 persons 数组更改为指针来实现此目的,如下所示:

persons := []*person{
    &person{
        name: "sebastiaan",
    },
    &person{
        name: "melle",
    },
}

然后这段代码就会按预期工作。

if person.Name == "Sebastiaan" {
    sebastiaan = person
}

在 go 中,循环变量被重用。 person 变量中的最后一个值是 melle,因此循环结束后它仍然存在。 sebastiaan 变量是一个指针,因此它不复制 person 值。

您可以通过将 sebastiaan 的类型从 *person 更改为 person 来修复此问题。

到这里,我们也就讲完了《为循环中的Go引用设置了无效引用》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>