一、channel 一等公民

channel 和函数一样,都是一等公民,可以当做参数

package main

import (
    "fmt"
    "time"
)

// channel这边创建,且接收也在这边
func createWorker(id int) chan<- int {
    c := make(chan int)
    go func() {
        for {
            fmt.Printf("for i = %d, chan = %d\n", id, <-c)
        }
    }()

    return c
}

func chanDemo() {
    // 箭头 在前是 接收数据,箭头 在后是 发数据
    var channels [10]chan<- int

    // 接收
    for i := 0; i < 10; i++ {
        channels[i] = createWorker(i)
    }

    // 分发
    for i := 0; i < 10; i++ {
        channels[i] <- 'a' + i
    }
}

func main() {
    chanDemo()
    time.Sleep(time.Second)
}

二、缓冲区

package main

import (
    "fmt"
    "time"
)

func bufferedChannel() {

    // 增加缓冲区,可以提升性能
    c := make(chan int, 3)

    go func() {
        for {
            fmt.Printf("%d\n", <-c)
        }
    }()

    c <- 1
    c <- 2
    c <- 3
    c <- 4
}

func main() {
    bufferedChannel()
    time.Sleep(time.Second)
}

三、关闭

package main

import (
    "fmt"
    "time"
)

func channelClose() {
    c := make(chan int)

    go func() {
        for {
            n, ok := <-c
             // 当ok等于false代表channel结束
            if !ok {
                break
            }
            fmt.Printf("%d\n", n)
        }

        // 使用range
        //for n :=range c{
        //    fmt.Printf("%d\n", n)
        //}
    }()

    c <- 1
    c <- 2
    c <- 3
    c <- 4

    // 如果channel不关闭,上面就会一直等待接收值
    // 如果关闭channel,channel则会一直发送相应的值,int 为0, 字符串就是空字符串......
    // 接收端通过判断int为0,字符串是空字符串来跳出接收
    close(c)

}

func main() {
    channelClose()
    time.Sleep(time.Second)
}