我想在go中编写一个函数,该函数将通用通道作为输入。我希望它能够接受任何频道,无论该频道是什么类型的。我认为我可以我们func myFunc(channel chan interface{})
,但我得到一个编译错误,当我试图传递我的通道给它。有办法在go中做到这一点吗?
——编辑——
我被要求提供一个最小的工作示例,所以我认为我将在下面分享一些代码。我想要的是像
这样的东西package main
func SendToChannel(arg interface{}, channel chan interface{}) error {
channel<-arg
//more logic here, potentially returning errors if something goes wrong
return nil
}
func main() {
IntChan := make(chan int)
StringChan := make(chan string)
SendToChannel(1,IntChan)
SendToChannel("hello",StringChan)
}
然而,这给出了一个编译错误,因为,正如Kelsnare指出的,chan int
,chan string
和chan interface{}
是三种完全不同的类型。
在2022年泛型出现之前,这似乎是不可能实现的,但如果有人发现了一个解决方案,我很乐意听到。
chan interface{}
和chan int
是两个不同的类型定义。
考虑这个例子:
package main
import (
"fmt"
)
func myFunc(ch chan interface{}) {
fmt.Println("I'm called")
}
func main() {
ch := make(chan int)
myFunc(ch)
fmt.Println("Done")
}
cannot use ch (type chan int) as type chan interface {} in argument to myFunc
让我们将类型更改为chan interface{}
package main
import (
"fmt"
)
func myFunc(ch chan interface{}) {
fmt.Println("I'm called")
}
func main() {
ch := make(chan interface{})
myFunc(ch)
fmt.Println("Done")
}
这个编译。以
chan int
为例——ch
的类型除了chan interface{}
之外的任何其他类型都将导致panic。
如果你绝对想要一个函数,你想要能够调用chan int
,chan string
,chan customtype
中的任何一个,你现在唯一的选择是接受一个普通的interface{}
。
正如@mkopriva所提到的,泛型很快就会到来。