问题描述
根据我在这里与遇到类似问题的人一起阅读的内容,很显然,一个渠道并没有关闭。我尝试了多种关闭渠道的方法,但仍然收到此错误。
预期的行为:当我在控制台中键入“ QUIT”时,请退出程序而不会出现错误
当前行为:当我在控制台中键入“ QUIT”时,出现此错误
panic: close of nil channel
goroutine 6 [running]:
main.main.func1(0xc000010200,0xc00006e060,0x0,0x0)
/home/greg/go/src/challenges/hydraChat/simplechat/simpleChat.go:24 +0xd7
created by main.main
/home/greg/go/src/challenges/hydraChat/simplechat/simpleChat.go:18 +0x88
exit status 2
这是代码。
type room struct {
MessageCH chan string
People map[chan<- string]struct{}
Quit chan struct{}
}
func main() {
room := room{MessageCH: make(chan string)}
enter code here
var msg string
go func() {
for {
fmt.Scan(&msg)
room.MessageCH <- msg
if msg == "QUIT" {
close(room.Quit)
return
}
}
}()
go func() {
for msg := range room.MessageCH {
fmt.Println("message received: ",msg)
}
defer close(room.MessageCH)
}()
<-room.Quit
}
解决方法
Zero value的频道为nil
,并根据您的经验关闭nil
频道恐慌。
关闭
nil
频道也会导致run-time panic。
您尝试关闭room.Quit
,但从未为其分配任何值。
在创建room
时执行以下操作:
room := room{
MessageCH: make(chan string),Quit: make(chan struct{}),}
有关渠道公理,请参见How does a non initialized channel behave?
还要注意,它在这里不会引起问题,但是您不应该完全按照其类型命名变量:room := room{...}
。声明之后,您将不再引用room
类型,该标识符将被遮盖(直到包含块的末尾)。