go学习篇之设计模式

xixionedream · · 1946 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

<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的设计模式欢迎分享哦! -* _*-




有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:xixionedream

查看原文:go学习篇之设计模式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1946 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传