Go - 指针
Go 中的指针很容易学习,也很有趣。某些 Go 编程任务使用指针可以更轻松地执行,而其他任务(例如通过引用调用)则无法在不使用指针的情况下执行。因此,要成为一名完美的 Go 程序员,就必须学习指针。
如您所知,每个变量都是一个内存位置,每个内存位置都定义了其地址,可以使用与号 (&) 运算符(表示内存中的地址)进行访问。请考虑以下示例,该示例将打印定义的变量的地址 -
package main
import "fmt"
func main() {
var a int = 10
fmt.Printf("Address of a variable: %x\n", &a )
}
编译并执行上述代码时,它会产生以下结果——
所以你了解了什么是内存地址以及如何访问它。现在让我们看看什么是指针。
什么是指针?
指针是一个变量,其值是另一个变量的地址,即内存位置的直接地址。与任何变量或常量一样,必须先声明指针,然后才能使用它来存储任何变量 address。指针变量声明的一般形式是 −
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 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 )
}
编译并执行上述代码时,它会产生以下结果——
在大多数操作系统上,不允许程序访问地址 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 程序员应该清楚以下指针的概念 -
概念 | 描述 |
---|---|
Go - 指针数组 |
您可以定义数组来保存多个指针。 |
Go - 指针到指针 |
Go 允许您将指针放在指针上,依此类推。 |
Go-向函数传递指针 |
通过引用或地址传递参数都允许被调用函数在调用函数中更改传递的参数。 |