天天看點

Go 面試每天一篇(第 107 天)

你好哇,歡迎來答題,一起來看下昨天題目的解析:

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/

答案以及解析會在下一篇文章中給出,鼓勵大家在留言區留下答案,抱團學習,日拱一卒,每天進步一點!

Go 面試每天一篇(第 107 天)

繼續閱讀