真实世界的Go设计模式 - 原型模式

*原型模式(Prototype Pattern)是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。

如果你有一个对象,并希望生成与其完全相同或者类似的一个复制品,你该如何实现呢?首先你必须新建一个属于相同类的对象,或者类似的对象,然后你必须遍历原始对象的所有成员变量,并将成员变量值复制到新对象中。在Go生态圈中,我们常常使用下面的库来做这份工作。

阅读全文

真实世界的Go设计模式 - 工厂模式

工厂模式(Factory pattern)是一种创建型模式,就是用来创建新对象的一种设计模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

23种设计模式中包含抽象工厂模式,工厂方法模式,其他也有人总结出简单工厂模式。这个工厂大量的依赖接口、抽象类和具体的类实现。在Go中,才不会有这么复杂的工厂创建模式,Go中最常见的工厂模式类似简单工厂模式,而且一般都是通过New或者NewXXX来实现。

阅读全文

替换标准库的map实现,SwissTable更快?

在最新的一期Go开发团队的每周会议中,他们讨论了Google3再评估SwissTable的性能,或许值得跟进,替换标准库的map。

  • SwissTable
    • [MichaelP]: Google3 may want to do some benchmarking on this. Maps are used heavily in google3. This may be of value to us.
    • So this may be worth investing in.

阅读全文

一个泛型的有序Go Map实现

我们知道, Go内建的map类型对于插入的元素并没有保持它们的插入顺序,遍历的时候也故意设置成随机的。因此,如果我们想让map保持元素的插入顺序,需要借助第三方的库才行,今天就给大家介绍一个这样的库OrderedMap

其实在其他编程语言中,也有类似的数据结构,比如java中的 LinkedHashMap, python中的OrderedDict

本文介绍如何使用Go语言实现这样的一种数据类型。注意我们要实现的是OrderedMap, 不是SortedMap或者TreeMap,SortedMap遍历的时候是按照Key的排序顺序遍历的,我们可以通过先获取所有的key并排序,再逐个访问对应的值。

但是OrderedMap遍历的时候要是保持插入的顺序,这怎么办到的呢?

阅读全文