- make和new的区别:都是用来初始化的
new多用来为基本数据类型初始化内存,返回的是指针
make用来初始化slince,map,channel,返回的是对应的类型 - 无缓冲通道和有缓冲通道区别:无缓冲通道传值得时候必须要有接收方来接收通道,否则报错;有缓冲通道可以直接传值
- 退出并发的三种方式:
利用全局变量来退出:定义exit来退出
var wg sync.WaitGroup var exit bool func worker() { for { fmt.Println("worker") time.Sleep(time.Second) if exit { break } } wg.Done() }
利用通道channel+标签来退出 一般用结构体来定义通道,内存占用小:
func worker(exitChan chan struct{}) { LOOP: for { fmt.Println("worker") time.Sleep(time.Second) select { case <-exitChan: // 等待接收上级通知 break LOOP default: } } wg.Done() }
官方context解法 在底层和使用通道没什么区别
var wg sync.WaitGroup func worker(ctx context.Context) { defer wg.Done() hello: for { fmt.Println("wuhu") time.Sleep(time.Second) select { case <-ctx.Done(): break hello default: } } } func main() { ctx, cancel := context.WithCancel(context.Background()) wg.Add(1) go worker(ctx) time.Sleep(time.Second * 3) cancel() wg.Wait() fmt.Println("over")
不同于上面两种的是:context可以同时退出多个并发程序,退出一个进程中子子孙孙的进程。