Go中 uintptr和 unsafe.Pointer 的区别?
时间: 2024-09-27 15:02:28 浏览: 21
golang利用unsafe操作未导出变量-Pointer使用详解
在Go语言中,`uintptr` 和 `unsafe.Pointer` 都用于操作底层内存,但它们之间有着本质的区别:
1. `uintptr`:这是一个无类型的整型常量,它表示的是一个内存地址的大小,通常是一个系统特定的宽度(通常是64位),但并不直接指向任何具体的内存位置。`uintptr`主要用于进行指针和其他整数值之间的转换,如计算内存距离、数组长度等。由于它是无类型的,所以可以直接与其他整数类型相加减。
```go
var p *int = &i // 假设i是一个变量
fmt.Println(uintptr(p) - uintptr(&i)) // 计算p到i的距离
```
2. `unsafe.Pointer`:这实际上是`unsafe.SliceHeader`类型的别名,代表了一段内存区域的起始地址。`unsafe.Pointer`允许开发者直接操作内存,比如读取或写入内存,甚至可以在不同类型的指针间进行转换。但是,这种操作非常危险,因为它绕过了Go的垃圾回收机制和类型检查,可能导致程序崩溃或安全漏洞。
```go
import "unsafe"
p := (*int)(unsafe.Pointer(&i)) // 转换为int指针
*p = 5
```
阅读全文