ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
~~~ 不可寻址 常量的值。 基本类型值的字面量。 算术操作的结果值。 对各种字面量的索引表达式和切片表达式的结果值。不过有一个例外,对切片字面量的索引结果值却是可寻址的。 对字符串变量的索引表达式和切片表达式的结果值。 对字典变量的索引表达式的结果值。 函数字面量和方法字面量,以及对它们的调用表达式的结果值。 结构体字面量的字段值,也就是对结构体字面量的选择表达式的结果值。 类型转换表达式的结果值。 类型断言表达式的结果值。 接收表达式的结果值。 ~~~ * [https://www.jianshu.com/p/c85fc3e31249](https://www.jianshu.com/p/c85fc3e31249) ~~~ package main //unsafe.Pointer:通用指针类型,用于转换不同类型的指针,不能进行指针运算 //uintptr:用于指针运算,GC 不把 uintptr 当指针,uintptr 无法持有对象。uintptr 类型的目标会被回收 //unsafe.Pointer 可以和 uintptr 进行相互转换 import ( "unsafe" "fmt" ) type T struct { t1 byte t2 int32 t3 int64 t4 string t5 bool } func main() { t := &T{1, 2, 3, "this is a example", true} ptr := unsafe.Pointer(t) t1 := (*byte)(ptr) fmt.Println(*t1) fmt.Println("-------------------------") //unsafe.Offsetof 函数用于获取两个值在内存中的起始存储地址之间的偏移量,以字节为单位。 t2 := (*int32)(unsafe.Pointer(uintptr(ptr) + unsafe.Offsetof(t.t2))) *t2 = 99 fmt.Println(t) fmt.Println("-------------------------") t3 := (*int64)(unsafe.Pointer(uintptr(ptr) + unsafe.Offsetof(t.t3))) fmt.Println(*t3) fmt.Println("-------------------------") *t3 = 123 fmt.Println(t) fmt.Println("-------------------------") } ~~~ > ### 其它例子 ~~~ package main import ( "unsafe" "fmt" ) func main() { number1 := make([]int, 2, 2) fmt.Println(&number1[1]) //结构体偏移量用这个:Offsetof, slice偏移量:Sizeof 详细看方法说明 ptr2 := (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&number1[0])) + unsafe.Sizeof(1))) fmt.Println(ptr2) } ~~~ > ### 相关阅读 * [Go语言学习笔记--unsafe.Pointer 和 uintptr](https://blog.csdn.net/cbmljs/article/details/82983639)