缓冲的渠道工人恐慌

时间:2015-06-27 09:05:13

标签: go

我使用缓冲通道编写了一个小工作队列。 我希望能够“重新启动”这名工作人员。

但是当我这样做时,我会惊慌地说“恐慌:关闭封闭通道”。

实际上我不明白为什么它是一个封闭的频道,因为它不应该在制作后再关闭。

以下是示例代码(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()
    }
}

你能告诉我那里的错误吗?

1 个答案:

答案 0 :(得分:3)

问题是您的重置功能中有一个值接收器,这意味着将复制s并且您在循环中看不到对t变量的影响。

要解决此问题,请将其设为指针接收器:

func (s *T) reset() {
    close(s.ch)
    s.ch = make(chan int, 2)
}

有关此主题的更多信息,请参阅Effective Go