你了解unsafe.Pointer这个不安全指针吗?

寅恪光潜
领域专家: 人工智能技术领域
2022-11-18 10:32:54

查看源码会发现存在很多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,一起进步,成为技术达人!

...全文
来 CSDN 抢优惠
拼手气红包 5.00元
275 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-编程语言 发布问题, 以便更快地解决您的疑问

198

社区成员

发帖
与我相关
我的任务
社区描述
从零开始的小白到进阶成技术达人。 一起学习,一起进步。
golanggo1.19 个人社区 贵州省·贵阳市
社区管理员
  • 寅恪光潜
  • 网络豆
  • Somnus_小凯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

Go语言集各语言优势之大成,从基础到进阶

一起学习,一起进步,成为技术达人!

试试用AI创作助手写篇文章吧