为了账号安全,请及时绑定邮箱和手机立即绑定

缓冲通道工作者恐慌

缓冲通道工作者恐慌

Go
繁花如伊 2021-10-18 14:51:40
我使用缓冲通道编写了一个小工作队列。我想有能力“重新启动”这个工人。但是当我这样做时,我会感到恐慌,说“恐慌:关闭通道”。其实我不明白为什么它是一个封闭的通道,因为它在制作后不应该再被关闭了。这是示例代码(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。


查看完整回答
反对 回复 2021-10-18
  • 1 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信