package main
import (
    "fmt"
    "sync"
)
var wg sync.WaitGroup
func main() {
    wg.Add(2)
    go nobufChannel() //不带缓冲区的初始化
    go bufChannel()   //有缓冲区的通道
    wg.Wait()
}
//不带缓冲区的初始化
func nobufChannel() {
    defer wg.Done()
    channel1 := make(chan int)
    go func() {
        x := <-channel1
        fmt.Println("channel里取出的数字:", x)
        close(channel1)
    }()
    channel1 <- 10
    fmt.Println("10存入channel")
}
//有缓冲区的通道
func bufChannel() {
    defer wg.Done()
    channel2 := make(chan int, 1) //指定了只能放一个数
    channel2 <- 10
    fmt.Println("10 发送到通道用bufChannel")
    //channel2 <- 20 //todo 指定了只能放一个数,取出后,才能继续向通道里存入数据
    //fmt.Println("20 发送到通道用bufChannel")
    ch2 := <-channel2
    fmt.Println("取出bufChannel中的数据,", ch2)
}
package main
import (
    "fmt"
    "sync"
)
var wg sync.WaitGroup
var once sync.Once
func main() {
    a := make(chan int, 100)
    b := make(chan int, 100)
    wg.Add(3)
    setValue(a)
    go getValue(a, b)
    go getValue(a, b)
    for ret :=range b{
        fmt.Println(ret)
    }
    wg.Wait()
}
func setValue(a chan int) {
    defer wg.Done()
    for i := 1; i <= 100; i++ {
        a <- i
    }
    close(a)
}
func getValue(a, b chan int) {
    defer wg.Done()
    for true {
        v,ok:= <-a
        if !ok {
            break
        }
        b  <- v
    }
    once.Do(func(){close(b)})
}原文:https://www.cnblogs.com/haima/p/12198891.html