我试着理解Go语言unsafe.Pointers
的内部结构。如果结构体中只有一个字段,并且返回一个指向Foo
的指针,则返回一个指向Bar
的指针。
有没有办法把指针一直返回到Foo
而不是Bar
?只有当*Foo
或Foo
有多个字段时才有效。这是编译器优化,还是与堆/堆栈分配有关?
type Bar struct {
ID int
Name string
Price float64
}
type Foo struct {
Bar *Bar
}
aFoo := Foo{
Bar: &Bar{},
}
//xunsafe.AsPointer implementation:
//
// func AsPointer(v interface{}) unsafe.Pointer {
// empty := (*emptyInterface)(unsafe.Pointer(&v))
// return empty.word
//}
fmt.Printf("Foo ptr: %v, Bar ptr: %v\n", AsPointer(aFoo), unsafe.Pointer(aFoo.Bar))
//Output: Foo ptr: 0xc00010a060, Bar ptr: 0xc00010a060
编辑:我正在使用的go1.17
。
1条答案
按热度按时间luaexgnf1#
使用
&aFoo
获取指向Foo
的指针。类型
unsafe.Pointer
是编译器理解的特殊类型。编译器允许在unsafe.Pointer
和语言规范通常不允许的其他类型之间进行转换。关于xunsafe.指针:您会看到不同的结果
以及
因为这些类型在存储到接口值中时具有不同的表示形式。大于一个字的值被复制到接口值专用的内存中,并且接口值存储指向该内存的指针。
xunsafe.AsPointer
函数确实具有处理这两种表示形式的代码。