這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> <span style="font-size:14px;"> 在純粹的物件導向設計語言中,設計模式對於我們大多數人來說應該是最熟悉最得力的武器了,可是在go語言中,從接觸至今這大半年的時間裡還沒遇到過go設計模式這個概念,這幾天想起來也就翻翻資料,找找關於go設計模式相關的資料,可是很少很少,就連最簡單的單例模式,自己想了很久也不知道用go語言怎麼去寫,因為go中沒有靜態概念,很是揪心。今天我們一起學習下他人寫的關於go的迭代器,其實完全是模仿JAVA C#語言中的迭代器,不過也很具有參考價值,至少為我們開了個好頭:</span></span>
以下代碼大部分來源於:http://www.tuicool.com/articles/vumYbu
// goIterator project main.gopackage mainimport "fmt"type Ints []intfunc (i Ints) First() Iterator {return Iterator{data: i,index: 0,}}type Iterator struct {data Intsindex int}func (i Iterator) Get() int {return i.data[i.index]}func (i Iterator) HasNext() bool {return i.index < len(i.data)}func (i Iterator) Next() Iterator {return Iterator{data: i.data,index: i.index + 1,}}func main() {ints := Ints{1, 2, 3}for it := ints.First(); it.HasNext(); it = it.Next() {fmt.Println(it.Get())}}大家比較熟悉JAVA的Integer,此處即模仿Integer類做了go的迭代器封裝
// goIterator project main.gopackage mainimport "fmt"type Ints []intfunc (i Ints) Iterator() func() (int, bool) {index := 0return func() (val int, ok bool) {if index >= len(i) {return}val, ok = i[index], trueindex++return}}func main() {ints := Ints{1, 2, 3}it := ints.Iterator()for {val, ok := it()if !ok {break}fmt.Println(val)}}
此處使用匿名函數和閉包來實現了迭代器的效果,不過此處不能很好的中斷迭代器,或者使迭代器在某個制定地方輸出我們想要的結果,不過思想確實很新穎。
// goIterator project main.gopackage mainimport "fmt"type Ints []intfunc (i Ints) Iterator() <-chan int {c := make(chan int)go func() {for _, v := range i {c <- v}close(c)}()return c}func main() {ints := Ints{1, 2, 3}for v := range ints.Iterator() {fmt.Println(v)}}
以上使用channel來完成迭代遍曆int[]每個元素的功能,雖然看似華麗,確實也很華麗,不過同上面一樣,不能很好的中斷,否則將帶來永久的阻塞。。。 而且線程間切換會有一定的cpu消耗,但可以忽略不計,思想很值得借鑒。看過了這些,我覺得設計模式在go的應用中,一定會讓我們看見不一樣的神奇的力量!
如果大家有什麼好的go的設計模式歡迎分享哦! -* _*-