码迷,mamicode.com
首页 > 编程语言 > 详细

Go语言基础之并发 goroutine chan

时间:2020-01-15 22:51:23      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:value   out   基础   class   add   group   一个   数据   Go语言   

示例一:

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

标签:value   out   基础   class   add   group   一个   数据   Go语言   

原文地址:https://www.cnblogs.com/haima/p/12198891.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!