gpt4 book ai didi

go - 修改 goroutine 中的结构?

转载 作者:IT王子 更新时间:2023-10-29 02:27:33 24 4
gpt4 key购买 nike

我正在试验 goroutines,似乎我无法修改 goroutine 中结构的值(下面的示例)。有什么解决办法吗?

编辑:如果我放置一个 sleep 语句,代码似乎会运行,这表明如果有更多时间 goroutines 会运行,但它们在 main() 中的所有内容都已经执行后完成运行。我如何“等待”我的 goroutines 在继续之前完成?

package main

import (
"fmt"
)

type num struct {
val int
}

func (d *num) cube_val() {
fmt.Println("changing value...")
d.val = d.val*d.val*d.val
}

func main() {
a := []num{num{1},num{3},num{2},num{5},num{4}}
for i := range a {
go a[i].cube_val()
}
// code that waits for go routines to finish should get inserted here ...
fmt.Println(a) // change does NOT happen

for i := range a {
a[i].cube_val()
}
fmt.Println(a) // change happens, and fmt.Println statements worked?
}

最佳答案

变化确实发生了。但它们发生在 fmt.Println(a) 之后。事实上,goroutines 和 print 语句的执行顺序没有保证,没有同步

如果您希望 fmt.Println(a) 在 goroutines 完成后发生,您必须等待它们,例如:( see also on Playground )

func main() {
var wg sync.WaitGroup
a := []num{num{1}, num{3}, num{2}, num{5}, num{4}}
for i := range a {
wg.Add(1)
go func(d *num) {
defer wg.Done()
d.cube_val()
}(&a[i])
}

wg.Wait()

fmt.Println(a)
}

关于go - 修改 goroutine 中的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42735444/

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