网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
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
ptr = (*Student)(unsafe.Pointer(hst))
fmt.Println("after modify:", *ptr)
}
结果:
before modify: {lx 1}
after modify: {zhang 11}
如上通过结果看出,hst中的数据直接通过内存读写进行了更改。
总结:unsafe.Pointer就是为了方便进行内存读写,不收系统类型的限制,方便灵活,但是一般实际中最好不要使用,因为不安全,可能会出现意想不到的问题。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**