go函数接受任何通道



我想在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 stringchan 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所提到的,泛型很快就会到来。

相关内容

  • 没有找到相关文章

最新更新