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函数传递指针 通过引用或地址传递参数都可以通过被调用的函数在调用函数中更改传递的参数. |
免责声明:以上内容(如有图片或视频亦包括在内)有转载其他网站资源,如有侵权请联系删除
-
设计总结|如何更好地表达活动品牌?
-
谈谈“目标思维”的落地
编辑导读:我们在做数据分析之前,一定要搞清楚需求方的目标到底是什么,要根据目标来重新定义业务方提出的问题,这就是目标思维。目标思维有多重要呢?应该如何落地呢...
-
在线教育平台竞品分析:网易云课堂vs腾讯课堂
本文从移动端出发,对当前比较热门的两款在线教育平台软件-网易云课堂和腾讯课堂进行比较和分析,不足之处还请大家多提意见。 市场分析 随着国内互联网技术的发展和移...
-
即学即用|父亲节活动的4种运营策略
-
B端产品经���和体验设计师的工作职责边界梳理
-
豆果美食电商分支用户体验报告及建议
-
数据分析师如何提高工作效率
在我们的日常工作中,提高工作效率是每个岗位都需要实现的,在工作中,面对比较凌乱的事情时,首先我们需要梳理清楚,按重要级进行开展;本文作者分享了关于...
-
2016中国云计算SaaS移动办公平台年度综合报告
-
网易大布局教育事业:网易公开课、网易云课堂和MOOC分析
-
一篇文章搞懂语音交互的来龙去脉