golang有指针。Go语言对指针的支持介于Java语言和C/C++语言之间,它既没有像Java那样取消了代码对指针的直接操作的能力,也避免了C/C++中由于对指针的滥用而造成的安全和可靠性问题。
本教程操作环境:windows10系统、GO 1.11.2、thinkpad t480电脑。
指针是一个代表着某个内存地址的值,这个内存地址往往是在内存中存储的另一个变量的值的起始位置。
Go语言保留了指针, 但是与C语言指针有所不同. 主要体现在:
默认值:nil
操作符 &
取变量地址, *
通过指针访问目标对象。
不支持指针运算,不支持 ->
运算符,直接用 .
访问目标成员。
先来看一段代码:
package main
import "fmt"
func main(){
var x int = 99
var p *int = &x
fmt.Println(p)
}
当我们运行到 var x int = 99
时,在内存中就会生成一个空间,这个空间我们给它起了个名字叫 x
,同时, 它也有一个地址,例如: 0xc00000a0c8
,当我们想要使用这个空间时,我们可以用地址去访问,也可以用我们给它起的名字 x
去访问.
继续运行到 var p *int = &x
时,我们定义了一个指针变量 p
,这个 p
就存储了变量 x
的地址.
所以,指针就是地址,指针变量就是存储地址的变量。
接着,我们更改 x
的内容:
package main
import "fmt"
func main() {
var x int = 99
var p *int = &x
fmt.Println(p)
x = 100
fmt.Println("x: ", x)
fmt.Println("*p: ", *p)
*p = 999
fmt.Println("x: ", x)
fmt.Println("*p: ", *p)
}
可以发现, x
与 *p
的结果一样的。
其中, *p
称为 解引用
或者 间接引用
。
*p = 999
是通过借助 x
变量的地址,来操作 x
对应的空间。
不管是 x
还是 *p
, 我们操作的都是同一个空间。