198
社区成员
发帖
与我相关
我的任务
分享查看源码会发现存在很多unsafe.Pointer这样的指针,比如slice切片的定义:
type slice struct {
array unsafe.Pointer // 指向底层数组
len int // 长度,必选
cap int // 容量,可选
}
其中第一个成员变量就是一个不安全指针,指向的是一个数组,那这样的设计有什么特点呢,或起到什么作用呢?
我们知道安全的内存管理是有必要的,不然野指针指向了本不该属于自己的地盘,那就存在内存泄漏或程序错误等问题,所以在C/C++中指针的管理就要比较注意,比如*int,*float64,*string等等之间是不能转换的,整型指针与浮点数指针之间都不可以,那Go中出现这个指针,它可以转化成其他具体类型的指针,简单看做一种万能指针,类似C中的void*指针,我们来看个示例:
func main() {
var i int = 4
var f *float32 = (*float32)(&i)
fmt.Println(f)
}
会报错,也就是说不同的指针类型之间不能转换
cannot convert &i (value of type *int) to type *float32
我们通过这个不安全指针就可以进行转换:
package main
import (
"fmt"
"unsafe"
)
func main() {
var i int = 4
var f *float32 = (*float32)(unsafe.Pointer(&i))
//var f *float32 = (*float32)(&i)
fmt.Printf("%T,%T\n", &i, f) //*int,*float32
*f = *f * 8
fmt.Printf("%T,%#v", i, i)//int,32
}
可以将*int通过unsafe.Pointer来转换成*float32,然后修改*float32指针的同时也更新了*int,这个就是做了指针类型的转换,名字叫做不安全,当然你恰当使用还是安全的哈哈
欢迎加入我们,一起学习go,一起进步,成为技术达人!