在此示例中,我们创建一个goroutine(在单独的线程中运行的函数),该例程接受一个chan参数,并简单地循环,每次将信息发送到通道中。
在中,main我们有一个for循环和一个select。该select直到之一将块处理case语句为真。在这里,我们宣布了两种情况;第一个是信息通过通道进入,第二个是没有其他情况发生时,称为default。
// 将select语句与通道一起使用(无超时)
package main
import (
"fmt"
"time"
)
// Function that is "chatty"
// 将单个参数设为一个通道以向下发送消息
func chatter(chatChannel chan<- string) {
// 完成后清理频道。
// 频道编写者应始终是关闭频道的作者。
defer close(chatChannel)
// 循环五次而死
for i := 1; i <= 5; i++ {
time.Sleep(2 * time.Second) // 睡2秒钟
chatChannel <- fmt.Sprintf("This is pass number %d of chatter", i)
}
}
// 我们的主要功能
func main() {
// 建立频道
chatChannel := make(chan string, 1)
// 用chat不休地开始执行例程(单独,不阻塞)
go chatter(chatChannel)
// 这个for循环可让the徒在睡觉时保持运转
for {
// select语句将阻塞该线程,直到满足以下两个条件之一
// 因为我们有默认设置,所以只要聊天者不聊天,我们都会达到默认设置
select {
// 每当聊天者聊天时,我们都会捕获并输出
case spam, ok := <-chatChannel:
// 打印通道中的字符串,除非通道已关闭
// 并且我们没有数据了,在这种情况下退出。
if ok {
fmt.Println(spam)
} else {
fmt.Println("Channel closed, exiting!")
return
}
default:
// 打印一行,然后睡眠1秒钟。
fmt.Println("此刻什么都没发生。")
time.Sleep(1 * time.Second)
}
}
}在Go Playground上尝试一下!