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 }