你好,Go程

单个通道(channel),单个协程,一个写,一个读。

package main

import (
	"fmt"
	"time"
)

func main() {
	// 创建一个用于传递string数据类型的通道
	ch := make(chan string)

	// 启动一个新的匿名协程
	go func() {
		time.Sleep(time.Second)
		// 发送 "Hello World" 到通道中
		ch <- "Hello World"
	}()
	// 从通道中读取
	msg, ok := <-ch
	fmt.Printf("msg='%s', ok='%v'\n", msg, ok)
}

// Output
// msg='Hello World', ok='true'

上面代码中的ch是无缓冲通道,又叫同步通道。

time.Sleep是为了解释main()函数会在ch上等待,意思是字面量函数会被当做协程执行,该协程通过通道发送数据需要一点时间。接收操作符<-ch会使main()函数的执行被阻塞。

译者注

Go语言中所称的字面量函数(Function literals)就是匿名函数,它可以被赋值给变量,也可以直接调用。而且它们还可以是闭包,因为它们可能引用外部包围函数中的变量,这些变量将在包围函数和字面量函数之间共享,它们不再被访问后才会回收。

如果main()函数不阻塞等待,则协程将在main()函数结束时被杀死,该协程甚至都没有机会把数据发送到通道。

译者注

go func() 语句的作用实际上是将协程加入调度,而不是真正立刻开始执行协程代码。协程真正开始和结束的时刻并不可预测,取决于系统中协程的调度顺序和协程自身的执行耗时。

main()结束时,所有的协程也都会被杀死,不论协程是否执行完完毕。所以要安全地结束协程,应该用无缓冲(同步)通道或sync.WaitGroup来保证协程都执行完毕。

最后更新于

这有帮助吗?