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中的空指针
如果你没有要分配的确切地址,则Go编译器将Nil值分配给指针变量。这是在变量声明时完成的。分配为nil的指针称为空指针。
nil指针是在几个标准库中定义的值为零的常量。考虑以下程序:
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程序员应该清楚以下指针概念:
Sr.No | 概念与说明 |
---|---|
1 | Go-指针数组 你可以定义数组以容纳多个指针。 |
2 | 转到-指向指针的指针 Go允许你将指针放在指针上,依此类推。 |
3 | 在Go中传递指向函数的指针 通过引用或地址传递参数都可以使被调用函数在调用函数中更改传递的参数。 |