猿问

缓冲通道工作者恐慌

我使用缓冲通道编写了一个小工作队列。我想有能力“重新启动”这个工人。


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


其实我不明白为什么它是一个封闭的通道,因为它在制作后不应该再被关闭了。


这是示例代码(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()

    }

}

你能告诉我我在那里做错了什么吗?


繁花如伊
浏览 184回答 1
1回答

智慧大石

问题是您的重置函数中有一个值接收器,这意味着s它将被复制,并且您看不到t循环中变量的影响。要解决这个问题,请将其设为指针接收器:func (s *T) reset() {    close(s.ch)    s.ch = make(chan int, 2)}有关此主题的更多信息,请参阅Effective Go。
随时随地看视频慕课网APP

相关分类

Go
我要回答