第一百零五天
2021.07

第一百零五天

1.下面代码输出什么?请简要说明。

var c = make(chan int)
var a int

func f() {
    a = 1
    <-c
}
func main() {
    go f()
    c <- 0
    print(a)
}

A. 不能编译;

B. 输出 1;

C. 输出 0;

D. panic;

参考答案及解析:B。能正确输出,不过主协程会阻塞 f() 函数的执行。

2.下面代码输出什么?请简要说明。

type MyMutex struct {
    count int
    sync.Mutex
}

func main() {
    var mu MyMutex
    mu.Lock()
    var mu1 = mu
    mu.count++
    mu.Unlock()
    mu1.Lock()
    mu1.count++
    mu1.Unlock()
    fmt.Println(mu.count, mu1.count)
}

A. 不能编译;

B. 输出 1, 1;

C. 输出 1, 2;

D. fatal error;

参考答案及解析:D。加锁后复制变量,会将锁的状态也复制,所以 mu1 其实是已经加锁状态,再加锁会死锁。