GO 使用channel进行同步 (channel 1)

genispan · · 3021 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

一直尝试去照着教程理解channel的用法和具体存在的意义。根据个人的理解,channel主要用来实现不同goroutine之间的数据同步和交互。

channel的基本知识:

channel 是有类型的管道,可以用 channel 操作符 <- 对其发送或者接收值。

ch <- v // 将 v 送入 channel ch。
v := <-ch // 从 ch 接收,并且赋值给 v。
(“箭头”就是数据流的方向。)
和 map 与 slice 一样,channel 使用前必须创建:
ch := make(chan int)

默认情况下,在另一端准备好之前,发送和接收都会阻塞。这使得 goroutine 可以在没有明确的锁或竞态变量的情况下进行同步。

代码如下:

package main

import "fmt"

func sum(a []int, c chan int) {
	sum := 0
	for _, v := range a {
		sum += v
	}
	c <- sum // send sum to c
}

func main() {
	a := []int{7, 2, 8, -9, 4, 0}

	c := make(chan int)
	go sum(a[:len(a)/2], c)
	go sum(a[len(a)/2:], c)
	/*如下代码会保证等到两个routine的结果输出到C后,继续执行,从而达到同步的效果*/
	x, y := <-c/*第一个channel被填充后赋值*/, <-c /*第二个channel被填充后赋值*/  
    
	fmt.Println(x, y, x+y)
}



有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:genispan

查看原文:GO 使用channel进行同步 (channel 1)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3021 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传