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为指针的基本类型;它必须是一个有效的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 */
Go语言指针详情:
指针有很多,但是很容易的概念,在Go编程中非常重要。有以下几个重要指针概念,作为一个Go程序员应该明确:
Concept | 描述 |
---|---|
Go -指针数组 | 可以定义数组持有一些指针 |
Go - 指针的指针 | 可以定义指针的指针 |
在Go中传递函数指针 | 通过引用或地址传递参数均使传递的参数将在调用函数被调用函数改变 |