Go - 指针


Go 中的指针学习起来既简单又有趣。一些 Go 编程任务使用指针更容易执行,而其他任务(例如引用调用)不使用指针就无法执行。因此,想要成为一名完美的 Go 程序员,学习指针就变得很有必要。

如您所知,每个变量都是一个内存位置,并且每个内存位置都定义了其地址,可以使用“与”运算符(表示内存中的地址)来访问该地址。考虑以下示例,它将打印定义的变量的地址 -

package main

import "fmt"

func main() {
   var a int = 10   
   fmt.Printf("Address of a variable: %x\n", &a  )
}

当上面的代码被编译并执行时,它会产生以下结果 -

Address of a variable: 10328000

这样您就了解了什么是内存地址以及如何访问它。现在让我们看看什么是指针。

什么是指针?

指针是一个变量,其值是另一个变量的地址,即内存位置的直接地址与任何变量或常量一样,您必须先声明一个指针,然后才能使用它来存储任何变量地址。指针变量声明的一般形式是 -

var var_name *var-type

这里,type是指针的基类型;它必须是有效的 C 数据类型,并且var-name是指针变量的名称。用于声明指针的星号 * 与用于乘法的星号相同。然而,在此语句中,星号用于将变量指定为指针。以下是有效的指针声明 -

var ip *int        /* pointer to an integer */
var fp *float32    /* pointer to a float */

所有指针的值的实际数据类型,无论是整数、浮点数还是其他类型,都是相同的,都是表示内存地址的长十六进制数。不同数据类型的指针之间的唯一区别是指针所指向的变量或常量的数据类型。

如何使用指针?

我们经常使用指针执行一些重要的操作:(a)定义指针变量,(b)将变量的地址分配给指针,以及(c)访问指针变量中存储的地址处的值。

所有这些操作都是使用一元运算符 * 执行的,该运算符返回位于其操作数指定的地址处的变量值。以下示例演示了如何执行这些操作 -

package main

import "fmt"

func main() {
   var a int = 20   /* actual variable declaration */
   var ip *int      /* pointer variable declaration */

   ip = &a  /* store address of a in pointer variable*/

   fmt.Printf("Address of a variable: %x\n", &a  )

   /* address stored in pointer variable */
   fmt.Printf("Address stored in ip variable: %x\n", ip )

   /* access the value using the pointer */
   fmt.Printf("Value of *ip variable: %d\n", *ip )
}

当上面的代码被编译并执行时,它会产生以下结果 -

Address of var variable: 10328000
Address stored in ip variable: 10328000
Value of *ip variable: 20

Go 中的 Nil 指针

如果没有要分配的确切地址,Go 编译器会为指针变量分配一个 Nil 值。这是在变量声明时完成的。被赋值为 nil 的指针称为nil指针。

nil 指针是一个在多个标准库中定义的值为 0 的常量。考虑以下程序 -

package main

import "fmt"

func main() {
   var  ptr *int

   fmt.Printf("The value of ptr is : %x\n", ptr  )
}

当上面的代码被编译并执行时,它会产生以下结果 -

The value of ptr is 0

在大多数操作系统上,不允许程序访问地址 0 处的内存,因为该内存由操作系统保留。不过,内存地址0有特殊意义;它表明该指针无意指向可访问的内存位置。但按照惯例,如果指针包含 nil(零)值,则假定它不指向任何内容。

要检查 nil 指针,您可以使用 if 语句,如下所示 -

if(ptr != nil)     /* succeeds if p is not nil */
if(ptr == nil)    /* succeeds if p is null */

Go 指针详细信息

指针有很多但简单的概念,它们对于 Go 编程非常重要。Go 程序员应该清楚以下指针的概念 -

先生编号 概念与描述
1 Go - 指针数组

您可以定义数组来保存多个指针。

2 Go - 指向指针的指针

Go 允许你将指针放在指针上等等。

3 将指针传递给 Go 中的函数

通过引用或通过地址传递参数都可以使被调用函数在调用函数中更改传递的参数。