我正在学习Go
Channel
。我在Go
package main
import "fmt"
func sample(mychan chan string) {
fmt.Println("Go Go Go Go")
fmt.Println("message received from channel is ", <-mychan)
}
func main() {
messageChan := make(chan string)
go sample(messageChan)
messageChan <- "hello"
}
发生的情况是,有时它会显示“消息已收到...”语句。有时它不显示。它总是显示“Go Go Go ..”语句。那么为什么它会跳过“消息已收到”语句。这是怎么回事呢?我很困惑。
当您
main()
完成时,程序会在sample()
goroutine 接收(或打印)消息之前终止。这实际上是取决于调度的不确定行为,这就是为什么您有时会看到该消息。您可以使用 修改程序以等待
sample()
完成sync.WaitGroup
。除此之外,我做的唯一重大改变是我现在sample()
从匿名 goroutine调用go func() {...}()
,以便能够在其自身完成wg.Done()
后执行操作sample()
。有关进一步解释的内容,请参阅https://pkg.go.dev/sync#WaitGroup
WaitGroup
。