学习实例(二)—— goroutine 和 channel
前一章:欢迎访问 Go语言学习(一)
Linux 下编写方法:
1 |
vim sum_by_group.go |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package main import "fmt" func sum(a []int, result chan int) { sum := 0 for _, v := range a { sum += v } result <- sum } func main() { a := []int{2, 3, 5, 6, 10, -5, 1, 0} result := make(chan int) go sum(a[:len(a)/2], result) go sum(a[len(a)/2:], result) x, y := <-result, <-result fmt.Println(x, y, x+y) } |
以上是一个求和的计算,Go语言代码
首先对 goroutine 和 channel 进行一个讲解。
goroutine 是Go语言并行设计的核心。
goroutine是一种比线程更轻量的实现,十几个goroutine可能在底层就是几个线程。
要使用goroutine只需要简单的在需要执行的函数前添加go关键字即可。//参见main函数内 第4.5两行
当执行goroutine时候,go语言立即返回,接着执行剩余的代码,goroutine不阻塞主线程。
channel 就像一个管道,但是可以双向传输数据,通过它我们可以接收和发送数据。//其实我觉得和指针有点像…个人见解
前面的代码中,假如result
是一个channel
那么:result <- value
是将数据发送到result
, 而key <- result
就是从result
中接收一个数据.
值得注意的地方是channel
只能通过Go语言内建的函数 make(chan type)
创建,其中type
指明了该channel
能传递的数据类型。
代码解析:
首先main函数内:
声明了一个int类型的数组(好吧,还是叫切片吧),然后通过内置函数make创建了一个channel,类型为int 名称为 result …
接下来通过go关键字 执行了两个 goroutine …它们的功能分别是计算切片a 的前半部分和后半部分的和。
在这里,main函数碰到go关键字,派发了 goroutine 执行相应函数后,立即返回执行剩余的代码,不会等待 goroutine 的返回。
在sum函数内:
计算切片的和,然后将结果发送到 channel…
接下来在main函数内:
x, y := <-result, <-result //这个语句从 channel 内获取结果 //PS.main函数会一直挂起,直到能从channel result 中获取数据。
最后,打印输出数据。
以上是 Go语言 简单的并行设计。
欢迎访问 Go语言学习(三)