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

1
close(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)
    }

}