unsafe.Pointer 是Go 语言中的一个特殊类型,用于进行低级别的内存操作。它允许你将任意类型的指针转换为通用的指针类型,并且可以将其转换回其他类型的指针。unsafe.Pointer 通常用于与 C 语言库交互、进行内存布局操作或绕过 Go 的类型系统。 1. 基本概念unsafe.Pointer 是一个通用指针类型,可以指向任何类型的值。
varsize =int(unsafe.Sizeof(s[0])) *len(s) returnunsafe.Slice((*byte)(unsafe.Pointer(&s[0])), size) } 这样一搞,[]MyType直接被看成[]byte,没拷贝,性能嘎嘎好。 再从[]byte转回去: funcBytesToMyTypeSlice(b []b...
runtime/slice.go typeslicestruct{ array unsafe.Pointer lenint capint } 其中: array是底层数组指针,指向该切片的第一个元素 len是切片的长度 cap是切片的容量 变量声明 主要是使用make关键字去进行切片的创建 // make([]T, len, cap) // len: 长度 // cap: 容量 // T: 类型 vars1 []int=make(...
array unsafe.Pointer //数组指针len int //数组长度 cap int //数组容量 } //cap指的是目前slice可装载的最大元素数量,即申请的空间,len指的是目前元素数量 我们新建一个make.go文件,在这里我们新建一个int型slice。 //创建一个silce package main import ( "fmt" ) func main() { s := make([]int...
// 取slice的最后的一个元素 end := unsafe.Pointer(uintptr(unsafe.Pointer(&b[0])) + 9 * unsafe.Sizeof(b[0])) // 等价于unsafe.Pointer(&b[9]) fmt.Println(*(*int)(end)) // 9 3.unsafe.Pointer unsafe.Pointer是特别定义的一种指针类型,它可以包含任意类型变量的地址。Pointer在unsafe包中...
下面的代码,模拟了通过指针移动,遍历slice的功能,其本质思想是,找到slice的第一个元素的地址,然后通过加上slice每个元素所占的大小作为偏移量,实现指针的移动和运算。 func main() { data := []byte("abcd") for i := 0; i < len(data); i++ { ptr := unsafe.Pointer(uintptr(unsafe.Pointer(&data...
uintptr 是 Go 内置的可用于存储指针的整型,而整型是可以进行数学运算的!因此,将 unsafe.Pointer 转化为 uintptr 类型后,就可以让本不具备运算能力的指针具备了指针运算能力:arr := [3]int{1, 2, 3} ap := &arr sp := (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(ap)) + unsafe.Sizeof(arr[...
unsafe.Pointer 我们前面介绍的指针都是被声明为指定类型的,而 unsafe.Pointer 是特别定义的一种指针类型,它可以包含任意类型变量的地址(类似 C 语言中的 void 类型指针)。Go 官方文档对这个类型有如下四个描述: 任何类型的指针都可以被转化为 unsafe.Pointer; ...
funcTestConvertPointerToSlice(t*testing.T){data:=[]int{1,2,3}varpointerStore[1]uintptrpointerStore[0]=uintptr(unsafe.Pointer(&data))// data pointer to pointerStore[0]// get data header pointervardataHeader=unsafe.Pointer(&pointerStore[0])nums1:=unsafe.Pointer(uintptr(dataHeader)+uintptr...
unsafe.Pointer和内存对齐 都听说过unsafe和unsafe.Pointer可以相互转换,其实他们也可以跟指针类型转换 *T:普通类型指针类型,用于传递对象地址,不能进行指针运算。 unsafe.poniter:通用指针类型,用于转换不同类型的指针,不能进行指针运算,不能读取内存存储的值(需转换到某一类型的普通指针) uintptr:用于指针运算,GC...