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