Golang Go语言中怎么获得接口中存储的数据指针?
目前我是这样做的,在做指针偏移的时候直接加上 8 个字节不知道会不会存在隐含的 Bug ,是否还有别的方法?
func main() {
var a int = 5
var s interface{}
s = &a
p := *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + uintptr(8)))
fmt.Printf("%p\n", unsafe.Pointer(p))
fmt.Printf("%p\n", &a)
}
求各位大佬指点。
Golang Go语言中怎么获得接口中存储的数据指针?
更多关于Golang Go语言中怎么获得接口中存储的数据指针?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
4 回复
uintptr(8) 可以替换成 unsafe.Sizeof(new(int))))
更多关于Golang Go语言中怎么获得接口中存储的数据指针?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
a_int, ok := s.(int) 可以类型断言啊
在Go语言中,接口(interface)是一种抽象类型,它规定了对象的行为。由于接口是隐式的,不能直接访问接口底层存储的数据指针。然而,你可以通过类型断言(type assertion)或类型选择(type switch)来获取接口底层的具体值,从而间接地获得其数据指针。
以下是使用类型断言获取接口中存储的数据指针的示例:
package main
import (
"fmt"
)
func main() {
var i interface{} = 42
// 类型断言
if val, ok := i.(int); ok {
// 获取值的地址即为指针
ptr := &val
fmt.Println("Value:", val)
fmt.Println("Pointer:", ptr)
fmt.Println("Pointer Value:", *ptr)
} else {
fmt.Println("Type assertion failed")
}
}
需要注意的是,val
是接口i
中值的拷贝(对于基本类型),所以&val
是指向这个拷贝的指针,而不是原始数据的指针。如果你需要原始数据的指针,通常需要重新设计你的代码结构,以避免使用接口来传递指针类型,或者在接口中直接定义指针类型。
例如,你可以将接口定义为指向具体类型的指针:
var i interface{} = &myStruct{}
if val, ok := i.(*myStruct); ok {
// val 现在是原始数据的指针
}
这种方式可以确保你获得的是原始数据的指针。