x
package main
 
1
package 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
分享