如何在golang中覆盖未知类型的通道

时间:2017-05-26 13:30:59

标签: csv go channel

我有一个函数接收一个字符串,并根据它创建一个基于字符串值的类型的通道。然后发送该通道以填充另一个线程。

在此功能中,我希望范围超过填充值并使用它们。

然而,我收到错误:“不能超过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接口{}

2 个答案:

答案 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
}

完整示例:https://play.golang.org/p/BJrAHiSAaw

答案 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")
}