Go最全golang之unsafe,我浪费了自己职业生涯的黄金5年

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

func main() {

	a := 10
	ptr := unsafe.Pointer(&a)
	fmt.Println(*(*int)(ptr))

	st := &Student{
		Name: "kkk",
	}

	stPtr := unsafe.Pointer(st)

	fmt.Println(*(*Student)(stPtr))
}

结果:

10
{kkk}

如上进行对应类型的转化直接使用,转化之后,直接操作内存地址方式处理.

b.指针类型运算

在c/c++中针对指针的处理是可以进行运算,比如,int *ptr = a[10];可以通过ptr++,ptr–来进行数组数据的访问。在go中,不能直接使用 unsafe.Pointer转化后进行运算的。必选要再转化成uintptr类型方可进行运算.【uintptr类型跟Pointer类型可以相互转化】如下示例:通过指针移动遍历数组元素。

	// 通过指针运算遍历数组
	arr := []int{1, 2, 3, 4, 5}
	for i := 0; i < len(arr); i++ {
		ptr := uintptr(unsafe.Pointer(&arr[0])) + unsafe.Sizeof(arr[0])*uintptr(i)
		fmt.Println(*(*int)(unsafe.Pointer(ptr)))
	}
	fmt.Println()

上述代码截图解释:

c.指针类型操作结构类型读写

除了系统自建类型,自定义的一些类型结构,可以通过转化成指针类型进行相关的数据读写操作。

如下操作一个自定义结构,进行数据覆盖拷贝:

func main(){
   // 自定义类型进行内存读写
	st := &Student{
		Name:   "lx",
		Number: 1,
	}
	hst := unsafe.Pointer(st)
	ptr := (*Student)(unsafe.Pointer(hst))
	fmt.Println("before modify:", *ptr)

	st1 := &Student{
		Name:   "zhang",
		Number: 11,
	}

	// 利用内存改写对应结构内容
	hst1 := unsafe.Pointer(st1)

	hst = hst1 // 将hst1内容写入hst


![img](https://img-blog.csdnimg.cn/img_convert/846cc23bf716860789ebf8934bd78949.png)
![img](https://img-blog.csdnimg.cn/img_convert/897918c3cefaf7082b53ac5f6d42bdff.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值