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的主要内容,如果未能解决你的问题,请参考以下文章