這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
最近閑來無事,即將畢業,把自己賣給了杭州的招銀網路,正好利用這段時間可以好好學習以下Go語言。
從高中開始接觸編程,當時還是用的Pascal語言,主要是為了參加資訊競賽,後來上了大學,大二開始學習Java便開始了我的Java旅程。到現在,已經用Java用了快六年了,前段時間找工作深深體會到了Java的美妙之處——需求量大。哈哈,相比實驗室中用C/C++的小夥伴們,真的是太幸福了!!!
好基友本科畢業後就去了聚美優品,兩年前就和我提到過Golang,說是很有前途,當時還沒什麼感覺,也就沒有當回事。直到前段時間,聽說B站和一些公司,後台系統用Golang重構了,加上區塊鏈的出現,感覺未來即使Golang不是最屌的,也會是主流。
說實話,重新學習一門語言,說簡單也簡單,說不簡單也不簡單。最近主要就是跟著Go指南,一步步瞭解熟悉Go語言(還好沒有忘乾淨C語言!!!)
指南中,前面的練習基本沒什麼難度,直到函數閉包這節。
利用函數閉包返回連續的費伯納西數。
初始狀態
package mainimport "fmt"// fibonacci 函數會返回一個返回 int 的函數。func fibonacci() func() int {}func main() {f := fibonacci()for i := 0; i < 10; i++ {fmt.Println(f())}}
看上去難度不大,我的思路是:維持一個長度為2的隊列,每次返回就將隊列中的兩個數相加,並出隊第一個數,結果再入隊。
首先要解決的問題是:隊列的實現。Java中有許多可以實現隊列的工具,那麼Go呢?萬能的Google告訴我,可以用container/list實現隊列。
list中的PushBack、Remove、Front都可以滿足我的需求。
當我真正寫的時候遇到一個比較尷尬的問題:list中元素都是Element類型,Go也沒有像Java一樣在建立list的時候指明元素的具體類型,而是採用了傳說中的萬能類型interface。
在我想要將兩個元素做加法時,報錯了:
cannot convert a.Value (type interface {}) to type int: need type assertion
解決辦法也很明確了:需要類型斷言
通過Google發現,類型斷言是Golang中解決這類問題的一種機制:A type assertion provides access to an interface value's underlying concrete value.類型斷言機制提供了介面值到具體類型值的轉化介面
對於我的需求,可以利用類型斷言實現interface的值到int值的轉換。
剩下的就是實現需求了
package mainimport ("fmt""container/list")// fibonacci 函數會返回一個返回 int 的函數。func fibonacci() func() int {fl:=list.New()fl.PushBack(int(0))fl.PushBack(int(0))return func() int {a:=fl.Front()fl.Remove(a)b:=fl.Front()tmp:=int(a.Value.(int))+int(b.Value.(int))//類型斷言if tmp == 0{tmp =1;}fl.PushBack(tmp)return tmp;}}func main() {f := fibonacci()for i := 0; i < 10; i++ {fmt.Println(f())}}
剛開始學習Go,其中有些概念可能理解的不對,希望大家幫忙指出!!!