我一直在研究即将发布的 Go 1.23 版本,因此我很想了解这个新 unique 软件包以及它旨在解决的问题。下面是对该调查的总结,我希望它对其他有兴趣了解更多信息的人有用。
1
Interning 和 Go
Interning,最初由 Lisp 引入的一个术语,是指在内存中只存储一个值并共享对它的唯一引用的过程,而不是分配多个副本并浪费内存。例如,Go 编译器已经在编译时执行了字符串常量的驻留,因此它不会分配多个相同的字符串,而是分配该字符串的单个实例并共享对它的引用,如下面的代码片段所示。
package main
import (
"fmt"
"reflect"
"unsafe"
)
const greet1 = "hello world"
const greet2 = "hello world"
func main() {
a := greet1
p := (*reflect.StringHeader)(unsafe.Pointer(&a))
fmt.Println("a address:", *&p.Data)
b := greet2
p2 := (*reflect.StringHeader)(unsafe.Pointer(&b))
fmt.Println("b address:", *&p2.Data)
}
$ go run main.go
a