一架梯子,一头程序猿,仰望星空!
Golang高级特性面试题 > 内容正文

Golang 中的指针的意义是什么?


问题简答

一个指针变量指向了一个值的内存地址,在参数传递过程中传地址比传值性能高。

问题详解:

指针用法

指针的使用,主要由两个运算符完成。

  • * 定义指针类型或者读取指针变量的值
  • & 读取变量地址

指针使用例子:

// 定义int类型指针变量p
var p *int

// 初始化并且定义变量i
i := 42

// 将i变量的地址,赋值给p变量, 这个时候指针p指向变量i
p = &i

// 打印指针p,指向的值,这里输出42
fmt.Println(*p)

// 将100 赋值给指针p指向的存储空间,相当于赋值给变量i
*p = 100

指针总结

说明:对于Go语言,严格意义上来讲,只有一种传递,也就是按值传递(by value)。当一个变量当作参数传递的时候,会创建一个变量的副本,然后传递给函数或者方法,你可以看到这个副本的地址和变量的地址是不一样的。

  • 指针类型用于传递地址, 而不是传递值, 因为 golang 的函数, 所有的参数都是传递一个复制的值. 如果值的体积过大, 那么就会严重降低效率, 而传递一个地址, 就会大大提高效率. 另外传递指针也能让 go 函数实现对变量值的修改.
  • 如果一个复杂类型的值被传递了若干次后, 和自己比较, 虽然用于保存的容器和名称变了, 但用于保存值的地址不变, 这个时候, 只要使用指针进行对比, 就知道还是原来的东西.