Golang Go语言中怎么获得接口中存储的数据指针?

发布于 1周前 作者 phonegap100 来自 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) 可以类型断言啊

如果不是逼不得已,不要自己用 unsafe.Pointer 。可以看看 [refelct2]( https://pkg.go.dev/github.com/modern-go/reflect2#readme-reflect2-get-set-unsafe-pointer) 这个包能拿到 unsafe.Pointer

在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 现在是原始数据的指针
}

这种方式可以确保你获得的是原始数据的指针。

回到顶部