gpt4 book ai didi

go - slice ,空接口(interface)的 channel 作为函数参数

转载 作者:行者123 更新时间:2023-12-01 22:12:54 24 4
gpt4 key购买 nike

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

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)
}

我想启用传递任何类型的对象,但要确保第一个参数是对象 slice ,第二个是 channel ,第三个是接受对象和 channel 的函数。

显然,go 编译器不喜欢这些参数。它不允许我像这样调用这个函数:
a := make([]*A)
c := make(chan *A)
f := func(_a *A, _c chan A) {
...
}
Parallelize(a, c, f)

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

最佳答案

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

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

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]
})

您也不需要通过 channel :
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)

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

关于go - slice ,空接口(interface)的 channel 作为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62477466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com