上周,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地址的详细信息。