我有一个函数接收一个字符串,并根据它创建一个基于字符串值的类型的通道。然后发送该通道以填充另一个线程。
在此功能中,我希望范围超过填充值并使用它们。
然而,我收到错误:“不能超过myChan(类型接口{})”
以下是我的代码示例:
func myFunc(input string) {
var myChan interface{}
switch input {
case "one":
myChan = make(chan One)
case "two":
myChan = make(chan Two)
}
go doStuff(&myChan)
for _, item := range myChan {
fmt.Println(item)
}
}
请帮助我了解如何完成此任务?
编辑:对不起,我的问题不够明确。换行doStuff(& myChan)就是这样:
go gocsv.UnmarshalToChan(clientsFile, &myChan)
根据gocsv UnmarshalToChan的文档“通道必须具有一种具体类型。”这就是为什么我不能拥有 chan接口{}
答案 0 :(得分:0)
myChan 变量不是频道,会以这种方式创建类型频道: chan interface {}
例如,如果您希望某个频道传递任何类型,您可以使用它:
func main() {
c := make(chan interface{}, 1)
go func() {
for a := range c {
fmt.Println(a)
}
}()
c <- 21
c <- "jazz"
c <- person{"Chet", 88}
time.Sleep(time.Second)
}
type person struct {
Name string
Age int
}
答案 1 :(得分:0)
我不是100%确定我理解这个问题,但是看看你写的代码,这就是我如何解决无法解决问题的问题。这将陷入僵局,因为并非一切都已定义......但是范围不是问题,也不应该是问题。此外,doStuff代码应该在通道关闭时发出信号,可以在等待组中传递,跟踪计数器等等。
package main
import (
"fmt"
"log"
)
// One ...
type One struct{}
// Two ...
type Two struct{}
func doStuff(*interface{}) {}
func myFunc(input string) {
var myChan interface{}
switch input {
case "one":
myChan = make(chan One)
case "two":
myChan = make(chan Two)
}
// might have to move this line of code into the switch block below...
// see commented example
go doStuff(&myChan)
switch myChan.(type) {
case chan One:
// in this way you're not passing an interface{} but a chan or type One or Two
// go doStuff(&myChan.(chan One))
for item := range myChan.(chan One) {
fmt.Println(item)
}
case chan Two:
// go doStuff(&myChan.(chan One))
for item := range myChan.(chan Two) {
fmt.Println(item)
}
default:
log.Fatalln("Unknown type entered")
}
}
func main() {
myFunc("one")
}