【发布时间】:2014-09-19 12:49:30
【问题描述】:
我有一个列表,有一个从中弹出元素的函数,以及另一个“接收”弹出元素的函数。我认为在接收器之后关闭通道会关闭通道,但似乎程序在到达那里之前是死锁的。这样做的最佳方法是什么?我是否应该有另一个通道来检测弹出何时完成?
func pop(list *[]int, c chan int) {
if len(*list) != 0 {
result := (*list)[0]
*list = (*list)[1:]
fmt.Println("about to send ", result)
c <- result
} else {
return
}
}
func receiver(c chan int) {
result := <-c
fmt.Println("received ", result)
}
var list = []int{1, 2, 3}
func main() {
fmt.Println("Main")
c := make(chan int)
go pop(&list, c)
go pop(&list, c)
for len(list) > 0 {
receiver(c)
}
close(c) //Dosen't seem to have any effect
fmt.Println("done")
}
【问题讨论】:
-
请在代码上运行'go fmt' - 这样我们更容易阅读它。如果您发布一个完整的示例,我们甚至可以将其复制并粘贴到我们的编辑器中并使用它。
-
对不起,上次有人编辑了我的代码,只留下了函数。我将添加一个指向操场的链接
标签: concurrency go goroutine