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 , 我们操作的都是同一个空间。


golang有指针吗