Go 示例: 通道同步

我们可以使用通道来同步跨 goroutine 的执行。以下是一个使用阻塞接收来等待 goroutine 完成的示例。当等待多个 goroutine 完成时,您可能更喜欢使用 WaitGroup

package main
import (
    "fmt"
    "time"
)

这是我们将在 goroutine 中运行的函数。done 通道将用于通知另一个 goroutine 该函数的工作已完成。

func worker(done chan bool) {
    fmt.Print("working...")
    time.Sleep(time.Second)
    fmt.Println("done")

发送一个值来通知我们已完成。

    done <- true
}
func main() {

启动一个 worker goroutine,并向其提供用于通知的通道。

    done := make(chan bool, 1)
    go worker(done)

阻塞直到我们在通道上从 worker 接收通知。

    <-done
}
$ go run channel-synchronization.go      
working...done                  

如果您从该程序中删除了 <- done 行,该程序将在 worker 甚至启动之前退出。

下一个示例:通道方向