你好哇,歡迎來答題,一起來看下昨天題目的解析:
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/
答案以及解析會在下一篇文章中給出,鼓勵大家在留言區留下答案,抱團學習,日拱一卒,每天進步一點!
