gpt4 book ai didi

pointers - 使用匿名 go 函数在循环内传递指针会导致仅使用最后一个元素指针

转载 作者:IT王子 更新时间:2023-10-29 00:54:29 25 4
gpt4 key购买 nike

所以在下面的代码中,我将指针传递给匿名 go 函数,但代码的行为并不像我期望的那样。

package main

import "fmt"

type (
Element struct{
Name string
}
)

func main() {
elements := []Element{{"first"}, {"second"}, {"third"}, {"fourth"}}
waiting := make(chan bool)

for _, element := range elements {
go func(element *Element){
fmt.Println("Element Name: ", element.Name)
waiting <- true
}(&element)
}

for i := 0; i < 4; i++{
<- waiting
}
}

我希望代码写成:

  • '第一个'
  • '第二个'
  • '第三个'
  • '第四个'

以任何顺序但它正在打印:

  • '第四个'
  • '第四个'
  • '第四个'
  • '第四个'

所以看起来匿名 go 函数“解析”了它的 *Element 参数到当时那个循环中的任何东西,所以这段代码将通过传递 Element{} 本身而不是指向元素的指针来修复。

我的问题是:

  • 这是定义好的行为吗?
  • 我怎么能重写它来接受指向我的元素{}的指针?

Playground :

http://play.golang.org/p/tcRvforQE4

编辑:问题格式

最佳答案

发生的情况是 for 循环将 elements[i] 的值放在每次迭代的相同 element 变量中,而不是创建一个新变量。这意味着 &element 始终是相同的地址(尝试在调用函数之前打印它!)

一个简单的解决方案是向它传递一个指向 slice 实际成员的指针:

for i := range elements {

go func(element *Element){
fmt.Println("PostStream: ", element.Name)
waiting <- true
}(&elements[i])
}

关于pointers - 使用匿名 go 函数在循环内传递指针会导致仅使用最后一个元素指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23637099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com