一对一

package main

import (
    . "fmt"
)

func main() {
    foo := make(chan int)
    // 启动写入线程
    go func() {
        for i := 0; i < 20; i ++ {
            foo <- i
        }
        close(foo)
    }()
    
    //读取数据
    for i := range foo {
        Println(i)
    }
}

一对多

package main

import (
    . "fmt"
    "sync"
)

var wg sync.WaitGroup

func main() {
    foo := make(chan int)

    // 启动写入线程
    go func() {
        for i := 0; i < 20; i ++ {
            foo <- i
        }
        close(foo)
    }()

    // 启动读取线程
    for i := 0; i < 4; i ++ {
        wg.Add(1)

        go func() {
            for i := range foo {
                Println(i)
            }
            defer wg.Done()
        }()

    }
    // 等待所有数据读取完成
    wg.Wait()
}

多对一

package main

import (
    . "fmt"
)

func main() {
    // 写入函数的线程数
    num := 4
    // 缓存为 10
     foo := make(chan int, 10)
     bar := make(chan int)
     // 监控是否全部写入
     go func() {
         for i := 0; i < num; i ++ {
             <-bar
         }
         close(foo)
     }()
    // 启动写入线程
    for i := 0; i < num; i ++ {

        go func() {
            for i := 0; i < 20; i ++ {
                foo <- i
            }
            bar <- 1
        }()
        
    }
    // 读取数据
    for i := range foo {
        Println(i)
    }
}

多对多

package main

import (
    . "fmt"
    "sync"
)

var wg sync.WaitGroup

func main() {
    // 写入函数的线程数
    inNum := 4
    // 读取函数的线程数
    outNum := 4
    // 缓存为 10
     foo := make(chan int, 10)
     bar := make(chan int)
     // 监控是否全部写入
     go func() {
         for i := 0; i < inNum; i ++ {
             <-bar
         }
         close(foo)
     }()

    // 启动写入线程
    for i := 0; i < inNum; i ++ {

        go func() {
            for i := 0; i < 20; i ++ {
                foo <- i
            }
            bar <- 1
        }()
        
    }
    // 读取数据
    for i:= 0; i < outNum; i ++ {
        wg.Add(1)
        go func() {
            for i := range foo {
                Println(i)
            }
            defer wg.Done()
        }()
    }
    // 等待所有数据读出
    wg.Wait()
}