猿问

同时调用具有不同签名的多个函数

我希望获得有关我正在尝试构建的内容的实现细节的一些反馈。我想实现的是拥有多个具有不同签名的函数,这些函数可以同时调用。

按顺序调用协程中的函数工作正常,但我想知道是否有一种方法可以以更习惯的方式执行此操作,例如迭代函数切片。

由于每个函数都有不同的参数和返回值,因此我很难弄清楚最好的方法是什么。在这里可以看到一个与我的目标有点相似的例子:Golang - 你如何创建具有不同签名的函数切片?但代码只是调用函数,而不考虑任何返回值。

我所想到的是否可能?


慕村225694
浏览 169回答 2
2回答

哆啦的时光机

您可以使用链接问题中的代码,只需将 它包装成一个匿名函数,在它自己的 goroutine 中执行,如下所示:v.Call(params)...// WaitGroup to wait on goroutines to finish their executionvar 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

汪汪一只猫

go func() { MyPackage.MyFunc(with, whatsoever, signature); }()- 粗略地说,这就是你需要的。您可以跨越与并发函数一样多的 goroutines(使用关键字)。go没有来自goroutine的“返回值”的概念。为此,您必须使用nels。它们是主要的通信机制。因此,您跨越一个具有任意签名功能的新goroutine,当它完成并且您得到一些结果时,您将它发送到goroutine之间共享的某个通道以进行通信。chanf通道是线程安全的,并且经过精心设计,可以优雅地处理此类通信。Go作为编程语言,提供了几个处理通道读/写的关键字。因此,Go中有一些非常基本的(并发)编程。但是,当然,您可以以不同的方式处理它。共享一些由某种锁定保护的可变内存,或依靠无锁方式。可以说,这是不那么惯用的方式,通常必须避免。始终首选频道。compareAndSet
随时随地看视频慕课网APP

相关分类

Go
我要回答