goroutine#
形如: go + function
1
2
3
4
5
6
7
8
|
func f(){
for i:=1; i<100; i++{
fmt.Println(i);
}
}
go f()
|
channel#
声明一个channel#
1
2
3
|
ch := make(chan int, 0) // 双向channel, 无缓冲
ch := make(chan<- int, 0) // 单向channel,只接收
ch := make(<-chan int, 0) // 单向channel,只发送
|
操作channel#
1
2
3
|
ch <- x // 将x写入channel ch
x, ok = <- ch // 从ch中读取数据,放入x。 ok判断是否正常获取
<- ch // 读取数据并抛弃
|
关闭channel#
- 对一个关闭了的channel发送信息,将产生panic
- 从一个关闭了的channel读取数据,可以读取其中剩余的(只是不能再写入)
问题1: 读取关闭了的channel会怎样?
- 有缓冲情况:先读完缓冲,然后ok一直都是false,读到对应chan类型的空值(?)
- 无缓冲情况:ok一直都是false,读到对应chan类型的空值(?)
问题2:重复关闭channel会怎样? 答:触发panic
问题3:向关闭了的channel发送信息会怎样?答:panic
利用无缓冲channel实现goroutine同步#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
func f(ch chan int){
for i:=1; i<100; i++ {
ch <- i
}
}
func main(){
ch := make(chan int)
go f(ch)
for i:=1; i<100; i++ {
recv, ok := <- ch
if !ok {
break
}
fmt.Println(recv)
}
}
|