在知乎看到有人分享了幾道筆試題,自己總結了一下其中與channel有關的題目。全部題目在這裡:
5、請找出下面**的問題所在。
func main()
}()// goroutine2
go func()
fmt.println("a: ", a)
} }()
close(ch)
fmt.println("ok")
time.sleep(time.second * 100)
}
8、請說出下面****寫錯了
func main()
// receiver goroutine
go func()
}()close(abc)
fmt.println("close")
time.sleep(time.second * 100)
}
首先要明確這兩個要點:
先看第一題,**執行時會丟擲panic:
panic: send on closed channel這是因為goroutine1 還沒把i 傳送給ch,ch 就在main函式中被close,當把i 傳送到ch 時就丟擲了panic。同理goroutine2 中從已關閉的ch 中接收資料時ok 會返回false,然後就return了。而且由於goroutine 的執行順序不一樣,輸出close、ok、panic的順序也會不一樣,有興趣的話可以自己跑幾次。
那麼如果想讓程式正常輸出應該怎麼改呢,下面是其中一種方法:
func main()
// 只有乙個goroutine向ch傳送資料,可以考慮在這個goroutine中關閉。
close(ch)
}()// goroutine2
go func()
fmt.println("a: ", a)
} }()
fmt.println("ok")
time.sleep(time.second * 100)
}
再來看第二題,執行時輸出完0—9後會一直輸出0,直到sleep的時間結束。這是因為在把0—9傳送給abc 後abc 就被關閉了,receiver goroutine 在接收完0—9後沒有跳出for 迴圈,而是一直從被關閉的abc 中接收資料,所以接收到的是abc 的零值——0。
有一種最簡單的辦法可以改正這個程式:
func main()
go func()
}()close(abc)
fmt.println("close")
time.sleep(time.second * 10)
}
使用channel時,
益智題 (簡單的兩道題)
a公司拍攝的 黃河頌 獲最佳故事獎 b公司的 孫悟空 獲最佳武術獎 c公司的 白娘子 獲最佳戲劇獎。a公司的經理說 我們三經理的姓分別是三部片名的第乙個字,而又同自己所拍 首字不一樣。另一公司的孫經理笑著說 真是這樣 那三經理各姓什麼?答案 a白 b黃 c孫 另一公司的孫經理 說明a不姓孫,而a又不...
兩道題題引發的思考
下週的討論課又到我講 了,這幾天都在看 準備ppt,選了一篇好難的 啊,看了這麼久了,還是不夠清晰。所以決定先換下思路,做點題。下面的 輸出是什麼 void add int p add p int main 分析這個題目看起來還是比較友好的。首先我們來分析一下add 函式。其實看名字就能知道它是在做...
兩道選擇題
教授面帶微笑,走進教室,對我們說 我受一家機構委託,來做一項問卷調查,請同學們幫個忙。一聽這話,教室裡輕微的一陣議論開了,大學課堂本來枯燥,這下好玩多了。問卷表發下來,一看,只有兩道題。第一題 他很愛她。她細細的瓜子臉,彎彎的娥眉,面色白皙,美麗動人。可是有一天,她不幸遇上了車禍,痊癒後,臉上留下幾...