有一個叫做Rosetta code的網站,它有所有語言的演算法,所以你可以在學習新語言時學習和比較。
在這里,我看到 go lang 的一種解決方案非常有趣,但我并不完全理解它。
func fib(c chan int) {
a, b := 0, 1
for {
c <- a
a, b = b, a b
}
}
func main() {
c := make(chan int)
go fib(c)
for i := 0; i < 10; i {
fmt.Println(<-c)
}
}
以下是我的一些疑惑
無限 for 回圈如何知道何時停止?c 頻道如何傳達這個資訊?func 呼叫之間的邏輯順序是什么?
感謝好心陌生人的幫助。
uj5u.com熱心網友回復:
無限 for 回圈如何知道何時停止?
正如您所說:這是一個無限回圈,根本不會停止(只要程式正在運行)。
c 頻道如何傳達這個資訊?
通道 c 根本不通信停止 for 回圈,回圈沒有停止。c 的唯一目的是將序列中的下一個數字從計算站點(無限 for 回圈)傳遞到使用站點(列印回圈)。
func 呼叫之間的邏輯順序是什么?
go fib(c)將 fib 作為 goroutine 啟動。這是您的代碼中發生的唯一且唯一的函式呼叫 (*)。一旦go fib(c)發生,您必須同時運行:1. 將列印 10 次的主函式和 2. 執行計算的 fib(c)。
有趣的東西——main() 和 fib(c) 之間的同步——發生在 main 執行<-c和(“在同一時刻”) fib 執行時c <- a。兩個函式,main 和 fib 都會作業,直到它們都到達這些行。一旦兩者都“在那條線上”,兩者都將“同時”發生:fib 將寫入/發送到 c 并且主要從 c “同時”消費/接收。之后 main 和 fib 兩個函式獨立地繼續。
一旦 main 完成,程式就結束了(這也“停止”了 fib 的無限回圈)。
(*) 對于挑剔者:除了與理解此代碼無關的 fmt.Printf 和 make 呼叫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/508646.html
標籤:算法for循环去斐波那契
下一篇:將恐慌捕獲到字串變數中
