参考这里 感谢!
golang中的指针:
- 普通指针:var ptr *int 定义一个int类型指针
- 内置类型uintptr,本质是一个无符号整形,足够容纳一个指针
- unsafe.Pointer,可以指向任意类型的指针
// uintptr is an integer type that is large enough to hold the bit pattern of any pointer.
// uintptr是一个能足够容纳指针位数大小的整数类型
uinptr 主要用来做地址的加减,配合unsafe.Pointer获取指针
package main
import (
"fmt"
"unsafe"
)
type Person struct {
age int
name string
}
func main() {
p := &Person{age: 30, name: "Bob"}
//获取到struct s中b字段的地址
p := unsafe.Pointer(uintptr(unsafe.Pointer(p)) + unsafe.Offsetof(p.name))
// p的实际地址,先转unsafe.Pointer
// 再转uintptr做加减
// 再转unsafe.Pointer,用于向普通类型指针转化
//将其转换为一个string的指针,并且打印该指针的对应的值
fmt.Println(*(*string)(p))
}
printFunction := []uint16{xxx}
type printFunc func()
unsafePrintFunc := (uintptr)(unsafe.Pointer(&printFunction))
printer := *(*printFunc)(unsafe.Pointer(&unsafePrintFunc))
printer()
如何把存指令的「数组」变成函数,一步强制类型转换很难。
- 先取「数组」首地址即一级指针unsafePrintFunc
- 再取二级指针,并进行类型转换,变为函数指针,再取出函数进行调用