我是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问题,请...
答案 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) {
....
}