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

我想实现一个并行化函数,在没有泛型的情况下,它看起来像这样:


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)

这样做的正确方法是什么?


月关宝盒
浏览 136回答 1
1回答

UYOU

有几种方法可以做到这一点,但我认为最好的方法是不要这样做。这是最好保持明确的常见模式之一,因为它更易于阅读和维护。但是,如果你坚持:一种方法是意识到您实际上并不需要传递切片元素:func Parallelize(n int, c chan interface{}, f func(int, chan interface{})) {&nbsp; &nbsp; var wg sync.WaitGroup&nbsp; &nbsp; defer wg.Done()&nbsp; &nbsp; for i:=0;i<n;i++ {&nbsp; &nbsp; &nbsp; &nbsp; wg.Add(1)&nbsp; &nbsp; &nbsp; &nbsp; go f(i, c)&nbsp; &nbsp; }&nbsp; &nbsp; wg.Wait()&nbsp; &nbsp; close(c)}并使用以下方法调用它:Parallelize(len(slice), ch, func(i int,ch chan interface{}) {&nbsp; &nbsp;// use slice[i]})您也不需要通过通道:func Parallelize(n int, f func(int)) {&nbsp; &nbsp; var wg sync.WaitGroup&nbsp; &nbsp; defer wg.Done()&nbsp; &nbsp; for i:=0;i<n;i++ {&nbsp; &nbsp; &nbsp; &nbsp; wg.Add(1)&nbsp; &nbsp; &nbsp; &nbsp; go f(i)&nbsp; &nbsp; }&nbsp; &nbsp; wg.Wait()}并称之为:Parallelize(len(slice), func(i int) {&nbsp; &nbsp;// use slice[i] and chan ch})`close(ch)另一种方法是使用反射。它会更丑陋,你将不得不处理运行时错误而不是编译时错误。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go