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)
        }
    }
}

在Go Playground上尝试一下!