为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕村225694 2022-08-01 18:42:05
我希望获得有关我正在尝试构建的内容的实现细节的一些反馈。我想实现的是拥有多个具有不同签名的函数,这些函数可以同时调用。按顺序调用协程中的函数工作正常,但我想知道是否有一种方法可以以更习惯的方式执行此操作,例如迭代函数切片。由于每个函数都有不同的参数和返回值,因此我很难弄清楚最好的方法是什么。在这里可以看到一个与我的目标有点相似的例子:Golang - 你如何创建具有不同签名的函数切片?但代码只是调用函数,而不考虑任何返回值。我所想到的是否可能?
查看完整描述

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


查看完整回答
反对 回复 2022-08-01
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

go func() { MyPackage.MyFunc(with, whatsoever, signature); }()- 粗略地说,这就是你需要的。您可以跨越与并发函数一样多的 goroutines(使用关键字)。go

没有来自goroutine的“返回值”的概念。为此,您必须使用nels。它们是主要的通信机制。因此,您跨越一个具有任意签名功能的新goroutine,当它完成并且您得到一些结果时,您将它发送到goroutine之间共享的某个通道以进行通信。chanf

通道是线程安全的,并且经过精心设计,可以优雅地处理此类通信。Go作为编程语言,提供了几个处理通道读/写的关键字。因此,Go中有一些非常基本的(并发)编程。

但是,当然,您可以以不同的方式处理它。共享一些由某种锁定保护的可变内存,或依靠无锁方式。可以说,这是不那么惯用的方式,通常必须避免。始终首选频道。compareAndSet


查看完整回答
反对 回复 2022-08-01
  • 2 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信