github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/20_trap/face/d1/main.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  	"time"
     7  )
     8  
     9  var c = make(chan int)
    10  var a int
    11  
    12  func f() {
    13  	a = 1
    14  	<-c
    15  }
    16  
    17  /*
    18  A. 不能编译;
    19  B. 输出 1;
    20  C. 输出 0;
    21  D. panic;
    22  
    23  B。能正确输出,不过主协程会阻塞 f() 函数的执行。
    24  */
    25  func demo1() {
    26  	go f()
    27  	c <- 0
    28  	fmt.Println(a)
    29  }
    30  
    31  /*
    32  A. 不能编译;
    33  B. 输出 1, 1;
    34  C. 输出 1, 2;
    35  D. fatal error;
    36  
    37  D。加锁后复制变量,会将锁的状态也复制,所以 mu1 其实是已经加锁状态,再加锁会死锁。
    38  
    39  */
    40  type MyMutex struct {
    41  	count int
    42  	sync.Mutex
    43  }
    44  
    45  func demo2() {
    46  	//fmt.Errorf()
    47  	var mu MyMutex
    48  
    49  	mu.Lock()
    50  	var mu1 = mu
    51  	mu.count++
    52  	mu.Unlock()
    53  	mu1.Lock()
    54  	mu1.count++
    55  	mu1.Unlock()
    56  	fmt.Println(mu.count, mu1.count)
    57  }
    58  
    59  /*
    60  A. 不能编译;
    61  B. 无输出,正常退出;
    62  C. 程序 hang 住;
    63  D. panic;
    64  
    65  D。WaitGroup 在调用 Wait() 之后不能再调用 Add() 方法的。
    66  */
    67  func demo3() {
    68  	var wg sync.WaitGroup
    69  	wg.Add(1)
    70  	go func() {
    71  		time.Sleep(time.Millisecond)
    72  		wg.Done()
    73  		wg.Add(1)
    74  	}()
    75  	wg.Wait()
    76  }
    77  
    78  func main() {
    79  	//demo1()
    80  	//demo2()
    81  	//demo3()
    82  
    83  }