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

切片,空接口的通道作为函数参数

切片,空接口的通道作为函数参数

Go
月关宝盒 2022-06-13 15:02:05
我想实现一个并行化函数,在没有泛型的情况下,它看起来像这样:func Parallelize(s []interface{}, c chan interface{}, f func(interface{}, chan interface{})) {    var wg sync.WaitGroup    defer wg.Done()    for _, si := range s {        wg.Add(1)        go f(si, c)    }    wg.Wait()    close(c)}我想启用传递任何类型的对象,但要确保第一个参数是对象切片,第二个是通道,第三个是接受对象和通道的函数。显然,go 编译器不喜欢这些参数。它不允许我像这样调用这个函数:a := make([]*A)c := make(chan *A)f := func(_a *A, _c chan A) {   ...}Parallelize(a, c, f)这样做的正确方法是什么?
查看完整描述

1 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

有几种方法可以做到这一点,但我认为最好的方法是不要这样做。这是最好保持明确的常见模式之一,因为它更易于阅读和维护。但是,如果你坚持:


一种方法是意识到您实际上并不需要传递切片元素:


func Parallelize(n int, c chan interface{}, f func(int, chan interface{})) {

    var wg sync.WaitGroup

    defer wg.Done()


    for i:=0;i<n;i++ {

        wg.Add(1)

        go f(i, c)

    }


    wg.Wait()

    close(c)

}

并使用以下方法调用它:


Parallelize(len(slice), ch, func(i int,ch chan interface{}) {

   // use slice[i]

})

您也不需要通过通道:


func Parallelize(n int, f func(int)) {

    var wg sync.WaitGroup

    defer wg.Done()


    for i:=0;i<n;i++ {

        wg.Add(1)

        go f(i)

    }


    wg.Wait()

}

并称之为:


Parallelize(len(slice), func(i int) {

   // use slice[i] and chan ch

})`

close(ch)

另一种方法是使用反射。它会更丑陋,你将不得不处理运行时错误而不是编译时错误。


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

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