golang,gouroutines,如何在另一个chanel中设置chanel,而不是在关闭母亲香奈儿之后阅读它

时间:2016-02-07 14:54:06

标签: go goroutine

我是Golang的新人,但努力学习这门伟大的语言!拜托,帮帮我..

我有2个香奈儿。 “In”和“Out”chanels

    in, out := make(chan Work), make(chan Work)

我设立了goroutines工作人员,他们正在寻找chanel,抓住工作并去做。我有一些工作,我会发送到香奈儿。

当工作人员完成工作时,它会写入Out chanel。

func worker(in <-chan Work, out chan<- Work, wg *sync.WaitGroup) {
    for w := range in {

        // do some work with the Work

        time.Sleep(time.Duration(w.Z))
        out <- w
    }
    wg.Done()
}

完成所有工作后,我会在程序的写入时关闭两个chanel。

现在我想在OUT chanel中写完成工作的结果,但是要在某些部分中分离所有部分,例如,如果工作类型是这样的:

type Work struct {
    Date string
    WorkType string
    Filters []Filter
}

如果WorkType是“firstType”我想将完成的工作发送到一个chanel,如果WorkType是“secondType”到第二个chan ...但是可能有20多种类型的工作..如何解决这个案例以更好的方式?

我可以在chanel OUT中设置chanel,并从这个子chanel中获取数据吗?

p.s:请原谅我的noob问题,请...

1 个答案:

答案 0 :(得分:1)

您可以使输出通道具有通用性,并使用类型开关处理不同的工作项。

假设您的输出频道只是chan interface{}

现成工作项的消费者看起来像:

for item := range output {
   // in each case statement x will have the appropriate type
   switch x := item.(type) {
       case workTypeOne:
          handleTypeOne(x)
       case workTypeTwo:
          handleTypeTwo(x)
       // and so on...

       // and in case someone sent a non-work-item down the chan
       default: 
          panic("Invalid type for work item!")
   }
}

并且处理程序处理特定类型,即

func handleTypeOne(w workTypeOne) { 
    ....
}