go 详解信道/通道 channel

2023-02-05  本文已影响0人  不死鸟F21

1.信道,就是一个管道,连接多个goroutine程序 ,它是一种队列式的数据结构,遵循先入先出的规则。

package main

import (
    "fmt"
    "time"
)

func chaninit() {
    // 定义 信道实例 := make(chan 信道类型)
    ch := make(chan int, 10)

    // 信道的容量和长度
    fmt.Println(cap(ch))
    ch <- 12
    fmt.Println(len(ch))

}

func increment(ch chan bool, x *int) {
    ch <- true
    *x = *x + 1
    <-ch
}

func test_incr() {
    // 注意要设置容量为 1 的缓冲信道
    pipline := make(chan bool, 1)

    var x int
    for i := 0; i < 1000; i++ {
        go increment(pipline, &x)
    }

    // 确保所有的协程都已完成
    // 以后会介绍一种更合适的方法(Mutex),这里暂时使用sleep
    fmt.Println("x 的值:0000", x)
    time.Sleep(time.Second)
    fmt.Println("x 的值:", x)
}
func for_test() {
    pipeline := make(chan int)

    go func() {
        pipeline <- 100
    }()
    go func() {
        num := <-pipeline
        fmt.Println("receive", num)
    }()
}
func main() {

    test_incr()
    time.Sleep(10 * time.Second)
}


package main

import (
    "fmt"
    "sync"
)

func test001() {
    ch := make(chan bool)
    go func() {
        for i := 0; i < 5; i++ {
            fmt.Println(i)
        }
        ch <- true
    }()
    <-ch
}

func worker(x int, wg *sync.WaitGroup) {
    defer wg.Done()
    for i := 0; i < 500; i++ {
        fmt.Println(i)
    }
}

func test002() {
    var wg sync.WaitGroup
    wg.Add(2)
    go worker(1, &wg)
    go worker(2, &wg)
    wg.Wait()

}

func main() {
    test001()
    test002()
}


上一篇 下一篇

猜你喜欢

热点阅读