Go中的指针简单易学.使用指针可以更轻松地执行某些Go编程任务,而不使用指针就无法执行其他任务(如通过引用调用).因此,有必要学习指向成为一个完美的Go程序员.
如您所知,每个变量都是一个内存位置,每个内存位置都定义了其地址,可以使用&符号访问( &)运算符,表示内存中的地址.考虑以下示例,它将打印定义的变量的地址 :
package mainimport "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 mainimport "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: 10328000Address stored in ip variable: 10328000Value of *ip variable: 20
Go中的Nil指针
如果您没有要分配的确切地址,Go编译器会将Nil值分配给指针变量.这是在变量声明时完成的.指定为nil的指针称为 nil 指针.
nil指针是一个常量,在几个标准库中定义了零值.考虑以下程序 :
package mainimport "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程序员应该清楚以下指针概念 :
Sr.No | 概念&描述 |
---|---|
1 | Go - 指针数组 您可以定义数组来保存多个指针. |
2 | Go - 指针到指针 Go允许你指针指向指针等等. |
3 | Go函数传递指针 通过引用或地址传递参数都可以通过被调用的函数在调用函数中更改传递的参数. |