Golang channel

Go的无缓冲channel的发送/接收操作会阻塞直到被接收/发送。如果是在goroutinue里面,怎么阻塞都不要紧,以为main结束了goroutine也就结束了。但如果在main里面阻塞就会报panic(fatal error: all goroutines are asleep - dead lock!)


package main

import (
	"fmt"
	"sync"
)

func main() {
	wg := sync.WaitGroup{}
	times := 10
	wg.Add(times)
	for i := 0; i < times; i++ {
		go func() {
			fmt.Println(i) // i指向循环段的变量,需要用临时变量代替才不会出错,这样写会有问题,打印出来的大部分数字都是times,而且是随机的。
			wg.Done()
		}()
	}
	wg.Wait()
	fmt.Println("all done")
}

channel和WaitGroup都可以用来完成并发的工作,channel更注重于通信,wg不通信。

sig := make(chan os.Signal)
signal.Notify(sig,syscall.SIGINT,syscall.SIGTERM) // 可以用来作等待,等待ctrl-c终止信号,不加后面的值就监测所有信号。
chan T          // 可以接收和发送类型为 T 的数据
chan<- float64  // 只可以用来发送 float64 类型的数据
<-chan int      // 只可以用来接收 int 类型的数据

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!