首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎样才能在戈朗的未知类型的频道上进行测距?

我怎样才能在戈朗的未知类型的频道上进行测距?
EN

Stack Overflow用户
提问于 2017-05-26 13:30:58
回答 2查看 1.3K关注 0票数 0

我有一个函数,它接收一个字符串,并在此基础上创建一个基于字符串值的类型通道。然后将这个通道发送出去,在另一个线程中填充。

在这个函数中,我想在填充的值上范围并使用它们。

但是,我得到了一个错误:“无法在myChan (类型接口{})"上进行范围

下面是我的代码示例:

代码语言:javascript
复制
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)实际上是这样的:

代码语言:javascript
复制
go gocsv.UnmarshalToChan(clientsFile, &myChan)

根据gocsv UnmarshalToChan的文档,“通道必须有一个具体的类型。这就是我不能拥有chan接口{}的原因。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-29 21:14:43

我不能百分之百地确定我是否理解这个问题,但是看看你写的代码,我就可以这样解决不能范围的问题了。这将导致死锁,因为并非所有的东西都是defined...but,范围不是问题,也不应该是问题。另外,doStuff码,应该信号什么时候通道应该关闭,可能通过一个等待组,保持跟踪与计数器,等等。

代码语言:javascript
复制
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")
}
票数 0
EN

Stack Overflow用户

发布于 2017-05-27 23:44:20

myChan变量不是通道,而是以这样的方式创建类型通道:chan接口{}

例如,如果希望通道传递任何类型,则可以使用以下命令:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44202925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档