在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为指针的基本类型;它必须是一个有效的Go数据类型,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指针是一个常数为零在几个标准库中定义的值。考虑下面的程序:
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 */