Golang学习笔记12:并发编程之channel
channel
Go语言在语言级别提供的goroutine间的通信方式
声明方式
var chanName chan ElementType
利用make 定义 可以指定chan 的容量。
channel的写与读
协程之间的通信通过channel进行,也可以进行协程之间的同步。
package main
import (
"fmt"
"time"
"strconv"
)
func Add(x, y int) {
z := x + y
fmt.Println(z)
}
func Read(ch chan int){ //没有写入会阻塞
value := <- ch //从value读出一个数据
fmt.Println("value:" + strconv.Itoa(value)) //(string)value
//上面该函数将输入int型转换成str型
}
func Write(ch chan int){
ch <- 10 //写入10
}
func main() {
ch := make(chan int)
go Read(ch) //先读,阻塞
go Write(ch) //写入之后,再进行读出
//写入之后没有读出操作也会阻塞
time.Sleep(10) //为了让协程都执行完
fmt.Println("end of code")
}
输出:
value:10
end of code
等十个协程都完成之后再结束
channel不用time
package main
import (
"fmt"
"strconv"
)
func Add(x, y int, quit chan int) {
z := x + y
fmt.Println(z)
quit <- 1 //每个协程开完之后,往里写一
}
func Read(ch chan int){ //没有写入会阻塞
value := <- ch //从value读出一个数据
fmt.Println("value:" + strconv.Itoa(value)) //(string)value
//上面该函数将输入int型转换成str型
}
func Write(ch chan int){
//ch <- 10 //写入10
}
func main (){
chs := make([]chan int , 10) //声明一个chan int 类型,10个
for i := 0 ; i < 10 ; i ++{ //遍历开协程
chs[i] = make(chan int) //对每一个元素进行实例化,真实的生成channel
go Add(i , i , chs[i]) //每一个协程执行完毕后,往里写一
}
for _, v := range chs{ //遍历channel数组
<-v //输出channel的值
}
}
输出:
> Output:
command-line-arguments
18
4
6
8
10
12
14
0
16
2
> Elapsed: 5.185s
> Result: Success
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 赛 の 任意门!
评论
ValineGitalk