文章目錄

go语言里虽然也有指针的概念,但他的指针不能像C++的那样进行指针加减运算、不同类型指针赋值等操作,他只能在相同类型间赋值。这样做的好处是安全,因为你除了能把这个指针指向其他同类型的值之外你不能对它进行任何改变。但这样同时也失去了指针的灵活性,少了很多操作的空间。
所以packet unsafe提供了这种机制,让你更自由的去操作指针。

unsafe.Pointer就像c++里面的void*,你可以把任意类型的指针转换成unsafe.Pointer,同时也可以把unsafe.Pointer转换成任意的类型。

1
2
3
4
5
6
7
8
9
10
11
12
import (
"unsafe"
)
type test struct {
I int
J int
}
func main() {
a := test{1}
var i *int = (*int)(unsafe.Pointer(&a))
*i = 6
}

但是unsafe.Pointer是不能做算术运算的,它的功能就是实现各种类型之间的转换。

uintptr可以进行算术运行,它的底层类型是int,关键是它可以和unsafe.Pointer相互转换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import (
"unsafe"
)
type test struct {
I int
J int
}
func main() {
a := test{1}
var i *int = (*int)(unsafe.Pointer(&a))
*i = 6
var j *int = (*int)(unsafe.Pointer(uintptr(&a) + unsafe.Offsetof(a.J)))
*j = 8
}

unsafe文档里的说明:
A pointer value of any type can be converted to a Pointer.
A Pointer can be converted to a pointer value of any type.
A uintptr can be converted to a Pointer.
A Pointer can be converted to a uintptr.

文章目錄