Go 简单选择使用通道
示例
在此示例中,我们创建一个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) } } }
在GoPlayground上尝试一下!