Go语言基础之并发 goroutine chan

Posted haima

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言基础之并发 goroutine chan相关的知识,希望对你有一定的参考价值。

示例一:

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 {
        v,ok:= <-a
        if !ok {
            break
        }
        b  <- v
    }
    once.Do(func(){close(b)})
}

以上是关于Go语言基础之并发 goroutine chan的主要内容,如果未能解决你的问题,请参考以下文章

Go语言Chan应用

go语言Goroutines 并发模式

Go 语言基础 之 并发和网络

Go语言基础之并发

19.Go语言基础之并发

Go语言系列之并发编程