你好哇,欢迎来答题,一起来看下昨天题目的解析:
1.ch := make(chan interface{}) 和 ch := make(chan interface{},1) 有什么区别?
参考答案及解析:第一个是声明无缓存通道,第二个是声明缓存为 1 的通道。无缓存通道需要一直有接收者接收数据,写操作才会继续,不然会一直阻塞;而缓冲为 1 则即使没有接收者也不会阻塞,因为缓冲大小是 1 ,只有当放第二个值的时候,第一个还没被人拿走,这时候才会阻塞。注意这两者还是有区别的。
2.下面的代码输出什么?请简要说明。
1var mu sync.Mutex 2var chain string 3 4func main() { 5 chain = "main" 6 A() 7 fmt.Println(chain) 8} 9func A() { 10 mu.Lock() 11 defer mu.Unlock() 12 chain = chain + " --> A" 13 B() 14} 15 16func B() { 17 chain = chain + " --> B" 18 C() 19} 20 21func C() { 22 mu.Lock() 23 defer mu.Unlock() 24 chain = chain + " --> C" 25}
- A. 不能编译;
- B. 输出 main --> A --> B --> C;
- C. 输出 main;
- D. fatal error;
参考答案即解析:D。使用 Lock() 加锁后,不能再继续对其加锁,直到利用 Unlock() 解锁后才能再加锁。
引自博客《鸟窝》 https://colobu.com/
解析若有不妥之处,欢迎在留言区交流、指正!
看下今天的题目:
1.下面代码输出什么?
1func main() { 2 fmt.Println(doubleScore(0)) 3 fmt.Println(doubleScore(20.0)) 4 fmt.Println(doubleScore(50.0)) 5} 6func doubleScore(source float32) (score float32) { 7 defer func() { 8 if score < 1 || score >= 100 { 9 score = source 10 } 11 }() 12 return source * 2 13}
2.下面代码输出什么?请简要说明。
1var mu sync.RWMutex 2var count int 3 4func main() { 5 go A() 6 time.Sleep(2 * time.Second) 7 mu.Lock() 8 defer mu.Unlock() 9 count++ 10 fmt.Println(count) 11} 12func A() { 13 mu.RLock() 14 defer mu.RUnlock() 15 B() 16} 17func B() { 18 time.Sleep(5 * time.Second) 19 C() 20} 21func C() { 22 mu.RLock() 23 defer mu.RUnlock() 24}
- B. 输出 1;
- C. 程序 hang 住;
答案以及解析会在下一篇文章中给出,鼓励大家在留言区留下答案,抱团学习,日拱一卒,每天进步一点!
