Go 和 Java 对比学习:单例模式( 三 )

因为是单例,所以两个基准测试需要分别执行 。
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.151sNew2 的结果:
$ 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.380sNew2 快十几倍 。
细心得读者会发现,在 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 对比学习:单例模式】


推荐阅读