【发布时间】:2020-09-27 19:25:38
【问题描述】:
func (s *server) send(m *message) error {
go func() {
s.outgoingMessageChan <- message
}()
return nil
}
func main(s *server) {
for {
select {
case <-someChannel:
// do something
case msg := <-s.outGoingMessageChan:
// take message sent from "send" and do something
}
}
}
我在另一个函数中退出 s.outgoingMessageChan,在使用匿名 go 函数之前,对该函数的调用通常会阻塞 - 这意味着无论何时调用 send,s.outgoingMessageChan <- message 都会阻塞,直到有东西退出其中。然而,像这样包裹它之后,它似乎不再阻塞了。我知道它会将此操作发送到后台并照常进行,但我无法理解这不会影响当前的函数调用。
【问题讨论】:
-
没错,
s.outgoingMessageChan <- message仍然阻塞,但现在它在自己的 goroutine 中运行,这不会影响您的主 goroutine。 -
如果它停止阻塞,但
send不再被调用会怎样? -
message被推送到s.outgoingMessageChan并且匿名 goroutine 终止。尝试重新访问相关的go tour parts,也许?理解 goroutine 对编写好的 go 语言至关重要。