首页 文章资讯内容详情

Golang 中的通道同步

2026-06-02 1 花语

如果我们想同步goroutines,我们可以使用通道。通过同步,我们希望让goroutine以定义的方式工作,例如,在前一个goroutine执行完成之前不启动下一个goroutine

渠道实现的是,因为它们可以被用来阻止过程,然后帮助,也可用于通知第二够程,以前的够程已经完成了它的任务。

示例1

让我们考虑一个非常基本的通道同步示例,我们将看到如何在缓冲通道的帮助下实现它。

考虑下面显示的代码。

package main import ( "fmt" "time" ) func check(done chan bool) { fmt.Print("欢迎来到...") time.Sleep(time.Second) fmt.Println("nhooo") done <- true } func main() { done := make(chan bool, 1) go check(done) <-done }

在上面的代码中,我们同步了代码,因为<-done只是阻塞了代码,除非并且直到它接收到我们在check函数中执行的值,否则它不会让其他任何东西执行。

如果我们在上面的代码上使用gorunmain.go命令,我们将看到以下输出。

输出结果

欢迎来到...nhooo

示例2

上面的例子可以用来进一步增强同步,因为我们可以让一个goroutine等待另一个goroutine

考虑下面显示的代码。

package main import ( "fmt" "time" ) func check(done chan bool) { fmt.Print("欢迎来到...") time.Sleep(time.Second) fmt.Println("nhooo") done <- true } func check2() { fmt.Println("从这里学习Go!") } func main() { done := make(chan bool, 1) go check(done) if <-done { go check2() time.Sleep(time.Second) } }输出结果

如果我们在上面的代码上使用gorunmain.go命令,我们将看到以下输出。

欢迎来到...nhooo 从这里学习Go!