gpt4 book ai didi

go - 并发如何与匿名函数一起工作?走

转载 作者:数据小太阳 更新时间:2023-10-29 03:29:11 28 4
gpt4 key购买 nike

我正在尝试遍历列表(例如 sql 行)并为每一行触发例程。问题是传递给函数的值不会在运行时进行评估,因此根据函数执行所需的时间,它可能会使用下一行中的任何值而不是当前行。

我知道我可以在普通函数中提取函数并传递参数,但我仍然想共享一些全局变量(以避免许多函数参数)因此需要使用匿名函数。 仍然让我感到困惑的是,匿名函数在执行时从环境中获取变量,因为据我所知,它应该像 & 在 unix 程序中一样在单独的例程中执行,通信仅通过 channel 完成。

问题是如何让匿名函数接收 vc 的副本并在运行时使用它?

package main

import "fmt"
import "time"


type mystruct struct {
i int
s string
}

func main() {

vc := mystruct{}
vc.i = 1
vc.s = "hi"
gl := "this is global"
for i := 1; i < 4; i++ {

go func() {
vc.i++
time.Sleep(1 * time.Second)

fmt.Printf("row specific is %v, global is %v", vc, gl)
}()

}
time.Sleep(2 * time.Second)

}

Play here

最佳答案

代码正在从多个 goroutines 访问相同的结构。您需要使用互斥锁来保护结构,以管理对其值的访问。您还需要等待所有 goroutines 完成。 Time.Sleep 本身并不能保证这一点。使用 WaitGroup 。这是一个工作示例:

package main

import "fmt"
import "time"
import "strconv"
import "sync"

type mystruct struct {
i int
s string
m sync.Mutex
}

func main() {

vc := mystruct{}
vc.i = 1
vc.s = "hi"

var wg sync.WaitGroup

for i := 0; i < 4; i++ {
wg.Add(1)
go func() {
vc.m.Lock()
defer vc.m.Unlock()
defer wg.Done()
vc.i++
time.Sleep(1 * time.Millisecond)
vc.s = "good bye" + strconv.Itoa(vc.i)
fmt.Printf("%v \n", vc)
}()

}

wg.Wait()

}

Playground :http://play.golang.org/p/K6rnQQSA1c

关于go - 并发如何与匿名函数一起工作?走,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24542711/

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