Featured image of post Golang 1.23: 新的 unique 包

Golang 1.23: 新的 unique 包

 

上周,Go 1.23 进入冻结期,这意味着不会添加任何新功能,并且任何已添加的功能不太可能被删除。这是一个预览即将发生的变化的好机会。
这篇文章,我们来介绍引入的新包unique

This article is first published in the medium MPP plan. If you are a medium user, please follow me in medium. Thank you very much.

根据wikipedia的描述,interning是按需重复使用具有同等值对象的技术,减少创建新对象的动作。这种创建模式经常用于不同编程语言中的数和字符串,可以避免不必要的对象重复分配的开销。
unique 参考了go4.org/intern ,将它移动到了 官方库,并且做了相应的修改。 issue #62483

就像官方描述的一样 unique 这个包提供了一种轻量化(unique仅仅八个字节)的比较两个变量是否相等的实现。比如下面这段代码

性能提升还是很明显的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
➜  unique git:(master) ✗ /Users/hxzhouh/workspace/googlesource/go/bin/go test -bench='BenchmarkMake1' -count=5 
goos: darwin
goarch: arm64
pkg: unique
cpu: Apple M1 Pro
BenchmarkMake1-10       122033748                9.692 ns/op
BenchmarkMake1-10       123878858                9.688 ns/op
BenchmarkMake1-10       123927121                9.706 ns/op
BenchmarkMake1-10       123849468                9.759 ns/op
BenchmarkMake1-10       123306187                9.673 ns/op
PASS
ok      unique  11.055s
➜  unique git:(master) ✗ /Users/hxzhouh/workspace/googlesource/go/bin/go test -bench='BenchmarkMake2' -count=5
goos: darwin
goarch: arm64
pkg: unique
cpu: Apple M1 Pro
BenchmarkMake2-10       1000000000               0.3118 ns/op
BenchmarkMake2-10       1000000000               0.3114 ns/op
BenchmarkMake2-10       1000000000               0.3119 ns/op
BenchmarkMake2-10       1000000000               0.3136 ns/op
BenchmarkMake2-10       1000000000               0.3115 ns/op
PASS
ok      unique  1.875s

但是 你不应该把他当作一个全局变量来用,存储共享数据,unique 的底层实现其实是一个map,查询的成本也是很高的。
比如

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
➜  huizhou92_test git:(master) ✗ /Users/hxzhouh/workspace/googlesource/go/bin/go test --bench=BenchmarkBusinessUnique --count=5 
goos: darwin
goarch: arm64
pkg: huizhou92_test
cpu: Apple M1 Pro
BenchmarkBusinessUnique-10          3114            373867 ns/op
BenchmarkBusinessUnique-10          3280            390818 ns/op
BenchmarkBusinessUnique-10          2941            376503 ns/op
BenchmarkBusinessUnique-10          3291            389665 ns/op
BenchmarkBusinessUnique-10          2954            398610 ns/op
PASS
ok      huizhou92_test  6.320s
➜  huizhou92_test git:(master) ✗ /Users/hxzhouh/workspace/googlesource/go/bin/go test --bench=BenchmarkBusinessString --count=5 
goos: darwin
goarch: arm64
pkg: huizhou92_test
cpu: Apple M1 Pro
BenchmarkBusinessString-10      526721706                2.185 ns/op
BenchmarkBusinessString-10      548612287                2.183 ns/op
BenchmarkBusinessString-10      549425077                2.188 ns/op
BenchmarkBusinessString-10      549012100                2.182 ns/op
BenchmarkBusinessString-10      548929644                2.183 ns/op
PASS
ok      huizhou92_test  7.237s

正是因为这样,关于unique的讨论其实还在继续,可能是因为用到的地方不是很多?不管怎么样, 这个新的包进入标准库已经是事实了。 net/netip 已经用unique 重构了它,用来比对IP地址的详细信息。

Licensed under CC BY-NC-SA 4.0
最后更新于 Jun 04, 2024 09:54 CST
使用 Hugo 构建
主题 StackJimmy 设计