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程序员来说应该是清晰的。
序号 | 概念&描述 |
---|---|
1 | Go – 指针数组 你可以定义数组来存储一些指针。 |
2 | Go – 指针的指针 Go允许你使用指针来指向另一个指针,以此类推。 |
3 | 在Go中传递指针到函数 通过引用或地址传递参数,使被调用函数可以修改被调用函数中的参数。 |