你好哇,欢迎来答题,一起来看下昨天题目的解析:
1.下面代码输出什么?请简要说明。
1func main() { 2 var ch chan int 3 var count int 4 go func() { 5 ch <- 1 6 }() 7 go func() { 8 count++ 9 close(ch) 10 }() 11 <-ch 12 fmt.Println(count) 13}
- A. 不能编译;
- B. 输出 1;
- C. 输出 0;
- D. panic;
参考答案及解析:D。ch 未被初始化,关闭时会报错。
2.下面代码输出什么?请简要说明。
1func main() { 2 var ch chan int 3 go func() { 4 ch = make(chan int, 1) 5 ch <- 1 6 }() 7 go func(ch chan int) { 8 time.Sleep(time.Second) 9 <-ch 10 }(ch) 11 12 c := time.Tick(1 * time.Second) 13 for range c { 14 fmt.Printf("#goroutines: %d\n", runtime.NumGoroutine()) 15 } 16}
- B. 一段时间后总是输出 #goroutines: 1;
- C. 一段时间后总是输出 #goroutines: 2;
参考答案即解析:C。程序执行到第二个 groutine 时,ch 还未初始化,导致第二个 goroutine 阻塞。需要注意的是第一个 goroutine 不会阻塞。
解析若有不妥之处,欢迎在留言区交流、指正!
看下今天的题目:
1func main() { 2 var m sync.Map 3 m.LoadOrStore("a", 1) 4 m.Delete("a") 5 fmt.Println(m.Len()) 6}
1func main() { 2 var wg sync.WaitGroup 3 wg.Add(2) 4 var ints = make([]int, 0, 1000) 5 go func() { 6 for i := 0; i < 1000; i++ { 7 ints = append(ints, i) 8 } 9 wg.Done() 10 }() 11 go func() { 12 for i := 0; i < 1000; i++ { 13 ints = append(ints, i) 14 } 15 wg.Done() 16 }() 17 wg.Wait() 18 fmt.Println(len(ints)) 19}
- B. 输出 2000;
- C. 输出可能不是 2000;
引自博客《鸟窝》 https://colobu.com/
答案以及解析会在下一篇文章中给出,鼓励大家在留言区留下答案,抱团学习,日拱一卒,每天进步一点!
