我有一个函数,它接收一个字符串,并在此基础上创建一个基于字符串值的类型通道。然后将这个通道发送出去,在另一个线程中填充。
在这个函数中,我想在填充的值上范围并使用它们。
但是,我得到了一个错误:“无法在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)
}
}请帮我理解一下如何做到这一点?
编辑:对不起,我的问题不够清楚。go doStuff(&myChan)实际上是这样的:
go gocsv.UnmarshalToChan(clientsFile, &myChan)根据gocsv UnmarshalToChan的文档,“通道必须有一个具体的类型。这就是我不能拥有chan接口{}的原因。
发布于 2017-05-29 21:14:43
我不能百分之百地确定我是否理解这个问题,但是看看你写的代码,我就可以这样解决不能范围的问题了。这将导致死锁,因为并非所有的东西都是defined...but,范围不是问题,也不应该是问题。另外,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")
}发布于 2017-05-27 23:44:20
myChan变量不是通道,而是以这样的方式创建类型通道:chan接口{}
例如,如果希望通道传递任何类型,则可以使用以下命令:
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
}https://stackoverflow.com/questions/44202925
复制相似问题