2 回答
TA贡献1779条经验 获得超6个赞
您可以使用链接问题中的代码,只需将 它包装成一个匿名函数,在它自己的 goroutine 中执行,如下所示:v.Call(params)
...
// WaitGroup to wait on goroutines to finish their execution
var wg sync.WaitGroup
for a, v := range f {
v := reflect.TypeOf(v)
//calling the function from reflect
val := reflect.ValueOf(f[a])
params := make([]reflect.Value, v.NumIn())
if v.NumIn() == 1 {
params[0] = reflect.ValueOf(1564)
} else if v.NumIn() == 2 {
params[0] = reflect.ValueOf("Test FROM reflect")
params[1] = reflect.ValueOf(float32(123456))
}
// Run them in parallel
wg.Add(1)
go func() {
defer wg.Done()
val.Call(params)
}()
}
wg.Wait()
在Go Playground上看到它
至于返回值 Value.Call() 返回,这是返回值的切片 - 所以这里也涵盖了你。您的问题没有指定您打算如何处理结果,但鉴于它们将并行生成,您可能需要通过通道发送它们 - 您也可以在匿名函数中执行此操作(在处理返回切片之后)。[]Value
TA贡献1898条经验 获得超8个赞
go func() { MyPackage.MyFunc(with, whatsoever, signature); }()
- 粗略地说,这就是你需要的。您可以跨越与并发函数一样多的 goroutines(使用关键字)。go
没有来自goroutine的“返回值”的概念。为此,您必须使用nels。它们是主要的通信机制。因此,您跨越一个具有任意签名功能的新goroutine,当它完成并且您得到一些结果时,您将它发送到goroutine之间共享的某个通道以进行通信。chan
f
通道是线程安全的,并且经过精心设计,可以优雅地处理此类通信。Go作为编程语言,提供了几个处理通道读/写的关键字。因此,Go中有一些非常基本的(并发)编程。
但是,当然,您可以以不同的方式处理它。共享一些由某种锁定保护的可变内存,或依靠无锁方式。可以说,这是不那么惯用的方式,通常必须避免。始终首选频道。compareAndSet
- 2 回答
- 0 关注
- 101 浏览
添加回答
举报