天天看點

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

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

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 住;

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

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

繼續閱讀