参考Russ Cox 2009年12月的文章,Go Data Structures: Interfaces
在内存优化部分,Russ建议,如果存储在interface{}中的数据小于uintptr的大小,那么该值将直接存储在接口中,并且不需要分配数据,然后获取其地址。
如果我用下面的代码测试它:
package main
import (
"fmt"
"unsafe"
)
type iface struct {
_ unsafe.Pointer
data unsafe.Pointer
}
func main() {
var i interface{} = 12
var pi = (*iface)(unsafe.Pointer(&i))
fmt.Printf("if.data: %p", pi.data)
}结果是:
if.data: 0x127e2c显然,这是一个地址,而不是在执行优化时所期望的值12。
Go不再支持界面优化了吗?还是我错过了什么?
发布于 2018-08-06 22:37:01
本页列出了编译器所做的优化。请注意,语言规范并不保证这些。
接口值
接口值中的字长值
将字大小或更小的非指针类型放在接口值中不会进行分配。
gc: 1.0-1.3,但不在1.4+中gccgo:从不
Go不再为Go1.4+执行这种优化。
https://stackoverflow.com/questions/51709033
复制相似问题