深入理解go语言的指针

135 阅读2分钟

理解指针

区分:指针指针变量

  • 指针就是内存地址

  • 指针变量其实就是一个普通的变量,只不过指针变量的值是内存地址,这个内存地址存储的值的类型取决于指针变量类型。


  • 传递数据时,传指针能避免数据拷贝,提高性能

  • go语言的指针没有指针运算,无法偏移,不同于C语言的指针。


通过“抽屉”来理解:

  • 一个抽屉类比一块内存

  • 给每个抽屉打上编号,这个编号就是内存地址

指针就是每个抽屉的编号,即指针就是内存地址

指针变量对应一个抽屉,只不过这个抽屉中的内容是其他抽屉的编号,即指针变量的值是内存地址


非指针传递和指针传递

首先,值传递都需要拷贝值的。

区别:

  • 指针传递,指针值(即地址大小固定且占用空间小由于指针“小”,所以分配的内存就小,节约空间;并且拷贝快,因此性能高。

  • 非指针传递,非指针值 占用的空间大小取决于 值的类型,可能很小、也可能很大,当值占用空间很大时,就需要分配很大内存,并且由于“大”,所以拷贝慢、性能差

是否使用指针

使用指针的好处:

  • 性能高,传递时不需要拷贝大量数据
  • 节约内存

使用指针的坏处:

  • 若多个地方共享一个指针,一个地方修改了指针的内容,则其他地方也会受到影响

  • 使用指针若调用链路比较深,每一步都要进行空指针判断

总之,是否使用指针,需要具体场景具体分析。