x
package main
1
main
2
3
import "fmt"
4
import "runtime"
5
import "unsafe"
6
7
//本测试是为了验证Go 1.15 发行说明中“Converting a small integer value into an interface value no longer causes allocation.”的优化说明
8
9
//虽然没法访问到empty interface的struct,但我们可以模仿一个麽
10
type eface struct {
11
typ, data unsafe.Pointer
12
}
13
14
//为了不让go优化和内联函数,这里使用一个返回empty interface的函数
15
func dummy(b int) interface{} {
16
return b
17
}
18
19
func main() {
20
//请确保golang是1.5版本
21
fmt.Println(runtime.Version())
22
fmt.Println("------------------")
23
//这里有4个值,分别是-1,-1,1,1。如果符合预期,则-1,-1的pointer应该是不一致的;而则1,1的pointer应该是一致的。
24
var slice = make([]interface{}, 4)
25
slice[0] = dummy(-1)
26
slice[1] = dummy(-1)
27
slice[2] = dummy(1)
28
slice[3] = dummy(1)
29
30
for i := 0; i < 4; i++ {
31
//利用unsafe.Pointer取得interface的地址;再强转成自己定义的struct(模仿empty interface的struct);然后输出data指向的地址
32
fmt.Printf("addr: %p ;\n", (*eface)(unsafe.Pointer(&slice[i])).data)
33
fmt.Printf("val : %d ;\n", *(*int)((*eface)(unsafe.Pointer(&slice[i])).data))
34
}
35
//如果符合预期,则-1,-1的pointer应该是不一致的;而则1,1的pointer应该是一致的。
36
fmt.Println("------------------")
37
}
38