在此示例中,我们创建一个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上尝试一下!