Go语言_Go语言的channel
2016-06-27 18:26
423 查看
channel是Go语言在语言级别提供的goroutine间的通信方式。我们可以使用channel在两个或多个goroutine之间传递消息。
channel是进程内的通信方式,因此通过channel传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。如果需要跨进程通信,我们建议用分布式系统的方法来解决,比如使用Socket或者HTTP等通信协议。Go语言对于网络方面也有非常完善的支持。
写入数据
通过ch <- 1语句向对应的channel中写入一个数据。在这个channel被读取前,这个操作是阻塞的
语法示例:
ch <- value
读取数据
向channel写入数据通常会导致程序阻塞,直到有其他goroutine从这个channel中读取数据
语法示例:
value := <-ch
完整的示例代码:
// Go_once project main.go
package main
import (
"fmt"
"sync"
)
var a string
var once sync.Once
var lock chan int = make(chan int)
var ct int = 1
func setup() {
if ct == 1 {
a = "Hello, world"
ct--
} else {
a = "GKM"
}
}
func doprint() {
once.Do(setup)
fmt.Println(a)
lock <- 1
}
func twoprint() {
go doprint()
go doprint()
}
func main() {
twoprint()
<-lock
fmt.Println("out of lock, lock value is ")
}
测试截图
channel是进程内的通信方式,因此通过channel传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。如果需要跨进程通信,我们建议用分布式系统的方法来解决,比如使用Socket或者HTTP等通信协议。Go语言对于网络方面也有非常完善的支持。
写入数据
通过ch <- 1语句向对应的channel中写入一个数据。在这个channel被读取前,这个操作是阻塞的
语法示例:
ch <- value
读取数据
向channel写入数据通常会导致程序阻塞,直到有其他goroutine从这个channel中读取数据
语法示例:
value := <-ch
完整的示例代码:
// Go_once project main.go
package main
import (
"fmt"
"sync"
)
var a string
var once sync.Once
var lock chan int = make(chan int)
var ct int = 1
func setup() {
if ct == 1 {
a = "Hello, world"
ct--
} else {
a = "GKM"
}
}
func doprint() {
once.Do(setup)
fmt.Println(a)
lock <- 1
}
func twoprint() {
go doprint()
go doprint()
}
func main() {
twoprint()
<-lock
fmt.Println("out of lock, lock value is ")
}
测试截图
相关文章推荐
- mongo 更新数组 键值对
- beego使用migrate错误
- Go语言学习:Channel
- 研究Extension和Category的一个例子
- POJ 2195 Going Home (最小费用最大流)
- 论文笔记 | Going deeper with convolutions
- Django项目结构布局
- LightOJ 1030 Discovering Gold
- mongo的数据备份
- Poj 2723 Go Deeper【2-SAT-----Tarjan强连通+二分】
- 特殊矩阵——三对角矩阵(Tridiagonal Matrix)
- hdu_3966_Aragorn's Story(树链剖分裸题)
- hdu_3966_Aragorn's Story(树链剖分裸题)
- 【读书笔记】Zygote 和 System 进程的启动过程
- 谷雪梅 Google中国
- Go语言学习笔记1
- 贪婪算法(Greedy Algorithm)
- 课后作业静态网页制作-仿Argo官网
- GOF-23种设计模式——装饰模式(学习笔记)
- 深入理解go的slice和到底什么时候该用slice?