<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.go package main import "fmt" type Ints []int func (i Ints) First() Iterator { return Iterator{ data: i, index: 0, } } type Iterator struct { data Ints index 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.go package main import "fmt" type Ints []int func (i Ints) Iterator() func() (int, bool) { index := 0 return func() (val int, ok bool) { if index >= len(i) { return } val, ok = i[index], true index++ return } } func main() { ints := Ints{1, 2, 3} it := ints.Iterator() for { val, ok := it() if !ok { break } fmt.Println(val) } }
此处使用匿名函数和闭包来实现了迭代器的效果,不过此处不能很好的中断迭代器,或者使迭代器在某个制定地方输出我们想要的结果,不过思想确实很新颖。
// goIterator project main.go package main import "fmt" type Ints []int func (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的设计模式欢迎分享哦! -* _*-
有疑问加站长微信联系(非本文作者)