理解指针
区分:指针和指针变量
-
指针就是内存地址
-
指针变量其实就是一个普通的变量,只不过指针变量的值是内存地址,这个内存地址存储的值的类型取决于指针变量类型。
-
传递数据时,传指针能避免数据拷贝,提高性能。
-
go语言的指针没有指针运算,无法偏移,不同于C语言的指针。
通过“抽屉”来理解:
-
一个抽屉类比一块内存
-
给每个抽屉打上编号,这个编号就是内存地址
指针就是每个抽屉的编号,即指针就是内存地址;
指针变量对应一个抽屉,只不过这个抽屉中的内容是其他抽屉的编号,即指针变量的值是内存地址
非指针传递和指针传递
首先,值传递都需要拷贝值的。
区别:
-
指针传递,指针值(即地址)大小固定且占用空间小,由于指针“小”,所以分配的内存就小,节约空间;并且拷贝快,因此性能高。
-
非指针传递,非指针值 占用的空间大小取决于 值的类型,可能很小、也可能很大,当值占用空间很大时,就需要分配很大内存,并且由于“大”,所以拷贝慢、性能差。
是否使用指针
使用指针的好处:
- 性能高,传递时不需要拷贝大量数据
- 节约内存
使用指针的坏处:
-
若多个地方共享一个指针,一个地方修改了指针的内容,则其他地方也会受到影响
-
使用指针若调用链路比较深,每一步都要进行空指针判断
总之,是否使用指针,需要具体场景具体分析。