Go语言 不安全指针,空接口字

kgqe7b3p  于 2023-02-17  发布在  Go
关注(0)|答案(1)|浏览(130)

我试着理解Go语言unsafe.Pointers的内部结构。如果结构体中只有一个字段,并且返回一个指向Foo的指针,则返回一个指向Bar的指针。
有没有办法把指针一直返回到Foo而不是Bar?只有当*FooFoo有多个字段时才有效。这是编译器优化,还是与堆/堆栈分配有关?

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

luaexgnf

luaexgnf1#

使用&aFoo获取指向Foo的指针。
类型unsafe.Pointer是编译器理解的特殊类型。编译器允许在unsafe.Pointer和语言规范通常不允许的其他类型之间进行转换。
关于xunsafe.指针:您会看到不同的结果

type Foo struct {
    Bar *Bar
}

以及

type Foo struct {
    Bar *Bar
    ASecondField int
}

因为这些类型在存储到接口值中时具有不同的表示形式。大于一个字的值被复制到接口值专用的内存中,并且接口值存储指向该内存的指针。xunsafe.AsPointer函数确实具有处理这两种表示形式的代码。

相关问题