我使用缓冲通道编写了一个小工作队列。我想有能力“重新启动”这个工人。但是当我这样做时,我会感到恐慌,说“恐慌:关闭通道”。其实我不明白为什么它是一个封闭的通道,因为它在制作后不应该再被关闭了。这是示例代码(http://play.golang.org/p/nLvNiMaOoA):package mainimport ( "fmt" "time")type T struct { ch chan int}func (s T) reset() { close(s.ch) s.ch = make(chan int, 2)}func (s T) wrk() { for i := range s.ch { fmt.Println(i) } fmt.Println("close")}func main() { t := T{make(chan int, 2)} for { go t.wrk() time.Sleep(time.Second) t.reset() }}你能告诉我我在那里做错了什么吗?
1 回答
智慧大石
TA贡献1946条经验 获得超3个赞
问题是您的重置函数中有一个值接收器,这意味着s它将被复制,并且您看不到t循环中变量的影响。
要解决这个问题,请将其设为指针接收器:
func (s *T) reset() {
close(s.ch)
s.ch = make(chan int, 2)
}
有关此主题的更多信息,请参阅Effective Go。
- 1 回答
- 0 关注
- 181 浏览
添加回答
举报
0/150
提交
取消