Go基础知识巩固二

35 阅读1分钟
  1. make和new的区别:都是用来初始化的
    new多用来为基本数据类型初始化内存,返回的是指针
    make用来初始化slince,map,channel,返回的是对应的类型
  2. 无缓冲通道和有缓冲通道区别:无缓冲通道传值得时候必须要有接收方来接收通道,否则报错;有缓冲通道可以直接传值
  3. 退出并发的三种方式
    利用全局变量来退出:定义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可以同时退出多个并发程序,退出一个进程中子子孙孙的进程。