因为是单例,所以两个基准测试需要分别执行 。
New1 的结果:
$ go test -benchmem -bench ^BenchmarkNew$ github.com/polaris1119/go-demo/singletongoos: darwingoarch: amd64pkg: github.com/polaris1119/go-demo/singletonBenchmarkNew-8 80470467 14.0 ns/op 0 B/op 0 allocs/opPASSok github.com/polaris1119/go-demo/singleton 1.151s
New2 的结果:
$ go test -benchmem -bench ^BenchmarkNew2$ github.com/polaris1119/go-demo/singletongoos: darwingoarch: amd64pkg: github.com/polaris1119/go-demo/singletonBenchmarkNew2-8 658810392 1.80 ns/op 0 B/op 0 allocs/opPASSok github.com/polaris1119/go-demo/singleton 1.380s
New2 快十几倍 。
细心得读者会发现,在 Go 中,饿汉式还有一种更好的实现方式,那就是使用 sync.Once,这是 Go 实现懒汉式更标准的做法 。核心代码如下(New3):
var once sync.Oncefunc New3() *singleton { once.Do(func() { instance = new(singleton) }) return instance}
通过基准测试,它的性能和 New2 差不多 。
此外,无论是 Java 还是 Go,都有一些其他“黑魔法”,比如 Go 语言中,利用 init 函数来初始化唯一的单例 。不过一般都不太建议,还是常规方式来 。
Go 语言单例模式,一般推荐优先考虑使用饿汉式 。但如果初始化比较耗时,懒汉式延迟初始化是更好的选择 。
4、使用场景在 Go 语言中,如下两个场景比较适合使用单例模式:
- 数据库实例 。只想创建一个 DB 对象实例,该实例在整个应用程序中使用 。
- 日志实例 。同样,只创建一个 Logger 的实例,并且在整个应用程序中使用它 。
- https://github.com/dwmkerr/hacker-laws
【Go 和 Java 对比学习:单例模式】
推荐阅读
- 姬昌姬发伯邑考关系 姬昌和伯邑考什么关系
- 指定扫描目标和主机发现 Nmap使用详解
- 蜡梅花茶的功效和功能,配搭功效不样的的花草茶
- 曹操和夏侯惇的关系是什么? 三国演义里的夏侯惇怎么死的
- 弓头鲸有多大 弓头鲸和座头鲸哪个大
- 红碎茶的历史和分类,广州红碎茶的特征分析
- 喝苦荞茶可以减肥吗,黑苦荞茶和黄苦荞茶哪个好
- 崂山红茶的功效和作用,黄芪红茶的功效与作用怎么样
- 小区物管应该履行哪些责任和义务
- 后背和腰疼是怎么回事