gpt4 book ai didi

go - channel 无法正常关闭?

转载 作者:行者123 更新时间:2023-12-03 10:10:18 25 4
gpt4 key购买 nike

从我在这里与遇到类似问题的人一起阅读的内容来看,很显然,一个 channel 并没有关闭。我尝试了多种关闭 channel 的方法,但仍然收到此错误。
预期的行为:当我在控制台中键入“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

}

最佳答案

channel 的Zero valuenil,就像您遇到的那样关闭nil channel panic 。
Spec: Close:

Closing the nil channel also causes a run-time panic.


您尝试关闭 room.Quit,但从未分配任何值。
在创建 room时执行以下操作:
room := room{
MessageCH: make(chan string),
Quit: make(chan struct{}),
}
有关 channel 公理,请参见 How does a non initialized channel behave?
还要注意,它在这里不会引起问题,但是您不应该完全按照其类型命名变量: room := room{...}。声明之后,您不能再引用 room类型,该标识符将被遮盖(直到包含块的末尾)。

关于go - channel 无法正常关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64250951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com