uintptr
到 unsafe.Pointer
的潜在错误转换。
如果内存中有存放指针值的 uintptr
类型单词,则从 uintptr
到 unsafe.Pointer
的转换无效,因为该单词对于堆栈复制和垃圾收集器不可见。
无效用法的示例:
nums := []int8{42, 24}
ptr := unsafe.Pointer(&nums[0])
addr := uintptr(ptr) // 地址存储到局部变量
ptr = unsafe.Pointer(addr + uintptr(1))
有效用法的示例:
nums := []int8{42, 24}
ptr := unsafe.Pointer(&nums[0])
ptr = unsafe.Pointer(uintptr(ptr) + uintptr(1))