我使用缓冲通道编写了一个小工作队列。 我希望能够“重新启动”这名工作人员。
但是当我这样做时,我会惊慌地说“恐慌:关闭封闭通道”。
实际上我不明白为什么它是一个封闭的频道,因为它不应该在制作后再关闭。
以下是示例代码(http://play.golang.org/p/nLvNiMaOoA):
package main
import (
"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()
}
}
你能告诉我那里的错误吗?
答案 0 :(得分:3)
问题是您的重置功能中有一个值接收器,这意味着将复制s
并且您在循环中看不到对t
变量的影响。
要解决此问题,请将其设为指针接收器:
func (s *T) reset() {
close(s.ch)
s.ch = make(chan int, 2)
}
有关此主题的更多信息,请参阅Effective Go。