如果您的代码中只有少数需要转换的实例,那么将这 7 行代码复制几次(或者甚至将其内联到使用它的地方,这将其减少到 4 行代码并且可能是最易读的解决方案)。
如果您确实在很多类型的通道和切片之间进行了转换,并且想要一些通用的东西,那么您可以通过反射来做到这一点,但代价是丑陋和在 ChanToSlice 的调用点缺少静态类型。
这是完整的示例代码,说明如何使用反射来解决此问题,并演示了它适用于 int 通道。
package main
import (
"fmt"
"reflect"
)
// ChanToSlice reads all data from ch (which must be a chan), returning a
// slice of the data. If ch is a 'T chan' then the return value is of type
// []T inside the returned interface.
// A typical call would be sl := ChanToSlice(ch).([]int)
func ChanToSlice(ch interface{}) interface{} {
chv := reflect.ValueOf(ch)
slv := reflect.MakeSlice(reflect.SliceOf(reflect.TypeOf(ch).Elem()), 0, 0)
for {
v, ok := chv.Recv()
if !ok {
return slv.Interface()
}
slv = reflect.Append(slv, v)
}
}
func main() {
ch := make(chan int)
go func() {
for i := 0; i < 10; i++ {
ch <- i
}
close(ch)
}()
sl := ChanToSlice(ch).([]int)
fmt.Println(sl)
}