
在面向对象编程语言中,单例模式(Singleton pattern)确保一个类只有一个实例,并提供对该实例的全局访问。
那么Go语言中,单例模式确认一个类型只有一个实例,并提供对改实例的全局访问,一般就是直接访问全局变量即可。
在面向对象编程语言中,单例模式(Singleton pattern)确保一个类只有一个实例,并提供对该实例的全局访问。
那么Go语言中,单例模式确认一个类型只有一个实例,并提供对改实例的全局访问,一般就是直接访问全局变量即可。
中文翻译成 建造者模式、生成器模式。
一个遵循《设计模式》一书臆造出来的例子如: Builder in Go / Design Patterns (refactoring.guru),复杂又难以理解。
工厂模式(Factory pattern)是一种创建型模式,就是用来创建新对象的一种设计模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
23种设计模式中包含抽象工厂模式,工厂方法模式,其他也有人总结出简单工厂模式。这个工厂大量的依赖接口、抽象类和具体的类实现。在Go中,才不会有这么复杂的工厂创建模式,Go中最常见的工厂模式类似简单工厂模式,而且一般都是通过New
或者NewXXX
来实现。
这是针对《100 Go mistakes and how to avoid them》 一书的总结。作者能总结出100条易犯的错误很不容易,最接近这个数目的是Go的50度灰:Golang新开发者要注意的陷阱和常见错误,没想到那已经是9年前的文章了。
Go 1.21 再有两三个月就发布了,很多同学都已经总结了Go 1.21的新特性了,为新的Go版本的到来造势,但是我还没看到有同学专门介绍Go 1.21为网络库新增加的一个特性,所以我专门新开一篇专门来介绍。
在最新的一期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类型对于插入的元素并没有保持它们的插入顺序,遍历的时候也故意设置成随机的。因此,如果我们想让map保持元素的插入顺序,需要借助第三方的库才行,今天就给大家介绍一个这样的库OrderedMap。
其实在其他编程语言中,也有类似的数据结构,比如java中的 LinkedHashMap, python中的OrderedDict
。
本文介绍如何使用Go语言实现这样的一种数据类型。注意我们要实现的是OrderedMap, 不是SortedMap或者TreeMap,SortedMap遍历的时候是按照Key的排序顺序遍历的,我们可以通过先获取所有的key并排序,再逐个访问对应的值。
但是OrderedMap遍历的时候要是保持插入的顺序,这怎么办到的呢?
渐渐地, Go泛型越来越多应用的Go的标准库中了。一些标准库的类型,比如container/heap
、container/list
、container/ring
、math
都是有机会支持泛型的,但是考虑到Go向下兼容的情况,这些包可能不会直接修改,最可能就是新建一些并发的包,或者放在扩展包中。
本篇文章将讲一个相对复杂的例子,也就是对sync.Map
的修改,让它支持泛型。