Go语言指针

Go语言中指针是很容易学习的,Go语言中使用指针可以更简单的执行一些任务。我们都知道变量是一种使用方便的占位符,用于引用计算机内存地址。Go语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址,以下实例演示了变量在内存中地址:

  1. package main
  2. imoprt "fmt"
  3. func main() {
  4. var a int = 10
  5. fmt.Printf("变量的地址:%x\n", &a)
  6. }

以上实例执行的结果为:

  1. 变量的地址: 20818a220

什么是指针

一个指针变量指向了一个值的内存地址,类似于变量和常量,在使用指针前需要声明指针。指针声明格式如下:

  1. var var_name *var-type

var-type为指针类型,var_name为指针变量,*用于指定变量是作为一个指针,以下是有效的指针声明:

  1. var ip *int /* 指向整形 */
  2. var fp *float32 /* 指向浮点型 */

如何使用指针

  • 定义指针变量;
  • 为指针变量赋值;
  • 访问指针变量中指向地址的值;

在指针类型前面加上*号(前缀)来获取指针所指向的内容。

  1. package main
  2. import "fmt"
  3. func main() {
  4. var a int= 20 /* 声明实际变量 */
  5. var ip *int /* 声明指针变量 */
  6. ip = &a /* 指针变量的存储地址 */
  7. fmt.Printf("a 变量的地址是: %x\n", &a )
  8. /* 指针变量的存储地址 */
  9. fmt.Printf("ip 变量储存的指针地址: %x\n", ip )
  10. /* 使用指针访问值 */
  11. fmt.Printf("*ip 变量的值: %d\n", *ip )
  12. }

以上实例输出结果为:

  1. a 变量的地址是: 20818a220
  2. ip 变量储存的指针地址: 20818a220
  3. *ip 变量的值: 20

Go空指针

当一个指针被定义后没有分配到任何变量时,它的值为nil。nil指针也称为空指针,nil在概念上和其他语言的null、None、nil、NULL一样,都指代零值或空值。一个指针变量通常缩写为ptr,如下实例代码所示:

  1. package main
  2. func main() {
  3. var ptr *int
  4. fmt.Printf("ptr 的值为 : %x\n", ptr )
  5. }

以上实例输出结果为:

  1. ptr 的值为 : 0

空指针判断:

  1. if(ptr != nil) /* ptr 不是空指针 */
  2. if(ptr == nil) /* ptr 是空指针 */

Go指针更多内容

接下来我们将介绍Go语言中更多的指针应用:

内容 描述
Go指针数组 可以定义一个指针数组来存储地址
Go指向指针的指针 Go支持指向指针的指针
Go向函数传递指针参数 通过引用或地址传参,在函数调用时可以改变其值

Go语言指针数组

在我们了解指针数组前,先看个实例,定义了长度为3的整形数组:

  1. package main
  2. import "fmt"
  3. const MAX int = 3
  4. func main() {
  5. a := []int{10, 100, 200}
  6. var i int
  7. for i = 0; i < MAX; i++ {
  8. fmt.Printf("a[%d] = %d\n", i, a[i])
  9. }
  10. }

以上代码执行输出结果为:

  1. a[0] = 10
  2. a[1] = 100
  3. a[2] = 200

有一种情况,我们可能需要保存数组,这样我们就需要使用到指针,以下声明了整形指针数组:

  1. vat ptr [MAX]*int

ptr为整形指针数组,英雌每个元素都指向了一个值,以下实例的三个整数将存储在指针数组中:

  1. package main
  2. import "fmt"
  3. const MAX int = 3
  4. func main() {
  5. a := []int{10, 100, 200}
  6. var i int
  7. var ptr [MAX]*int
  8. for i = 0; i < MAX; i++ {
  9. ptr[i] = &a[i] /* 整数地址赋值给指针数组 */
  10. }
  11. for i = 0; i < MAX; i++ {
  12. fmt.Printf("a[%d] = %d\n", i, *ptr[i])
  13. }
  14. }

以上代码输出结果为:

  1. a[0] = 10
  2. a[1] = 100
  3. a[2] = 200

Go语言指向指针的指针

如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量;当定义一个指向指针的指针变量时,第一个指针存放第二个指针的地址,第二个指针存放变量的地址;如下图所示:

指向指针的指针变量声明格式如下:

  1. var ptr **int

访问指向指针的指针变量值需要使用两个*号,如下所示:

  1. package main
  2. import "fmt"
  3. func main() {
  4. var a int
  5. var ptr *int
  6. var pptr **int
  7. a = 3000
  8. /* 指针ptr地址 */
  9. ptr = &a
  10. /* 指向指针ptr地址 */
  11. pptr = &ptr
  12. /* 获取pptr的值 * /
  13. fmt.Printf("变量 a = %d\n", a)
  14. fmt.Printf("指针变量 *ptr = %d\n", *ptr)
  15. fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr)
  16. }

以上实例执行结果为:

  1. 变量 a = 3000
  2. 指针变量 *ptr = 3000
  3. 指向指针的指针变量 **pptr = 3000

Go语言指针作为函数参数

Go语言允许函数传递指针,只需要在函数定义的参数上设置为指针类型即可,以下实例演示了如何向函数传递指针,并在函数调用后修改函数内的值:

  1. package main
  2. import "fmt"
  3. func main() {
  4. /* 定义局部变量 */
  5. var a int = 100
  6. var b int= 200
  7. fmt.Printf("交换前 a 的值 : %d\n", a )
  8. fmt.Printf("交换前 b 的值 : %d\n", b )
  9. /* 调用函数用于交换值
  10. * &a 指向 a 变量的地址
  11. * &b 指向 b 变量的地址
  12. */
  13. swap(&a, &b);
  14. fmt.Printf("交换后 a 的值 : %d\n", a )
  15. fmt.Printf("交换后 b 的值 : %d\n", b )
  16. }
  17. func swap(x *int, y *int) {
  18. var temp int
  19. temp = *x /* 保存 x 地址的值 */
  20. *x = *y /* 将 y 赋值给 x */
  21. *y = temp /* 将 temp 赋值给 y */
  22. }

以上实例运行结果为:

  1. 交换前 a 的值 : 100
  2. 交换前 b 的值 : 200
  3. 交换后 a 的值 : 200
  4. 交换后 b 的值 : 100

Go语言【第十篇】:Go数据结构之:指针的更多相关文章

  1. Python开发【第二十篇】:缓存

    Python开发[第二十篇]:缓存redis&Memcache   点击这里 Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy ...

  2. Spring Cloud第十篇 | 分布式配置中心Config

    ​ 本文是Spring Cloud专栏的第十篇文章,了解前九篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Clo ...

  3. Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇)

    Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 目录 Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 1 Optimizing Storage Layout f ...

  4. 解剖SQLSERVER 第十篇 OrcaMDF Studio 发布+ 特性重温(译)

    解剖SQLSERVER 第十篇  OrcaMDF Studio 发布+ 特性重温(译) http://improve.dk/orcamdf-studio-release-feature-recap/ ...

  5. 第十篇 SQL Server代理使用代理帐户

    本篇文章是SQL Server代理系列的第十篇,详细内容请参考原文 在这一系列的上一篇,你查看了msdb库下用于授权访问SQL Server代理的安全角色.这些角色包括SQLAgentUserRole ...

  6. 第十篇 Replication:故障排除

    本篇文章是SQL Server Replication系列的第十篇,详细内容请参考原文. 复制故障排除是一项艰巨的任务.在任何复制设置中,都涉及到很多移动部件,而可用的工具并不总是很容易识别问题.Th ...

  7. 第十篇 Integration Services:高级事件行为

    本篇文章是Integration Services系列的第十篇,详细内容请参考原文. 简介在前一篇, we introduced fault tolerance by examining method ...

  8. 第十篇 SQL Server安全行级安全

    本篇文章是SQL Server安全系列的第十篇,详细内容请参考原文. 不像一些其他industrial-strength数据库服务,SQL Server缺乏一个内置保护个别数据记录的机制,称为行级安全 ...

  9. shell基础二十篇 一些笔记

    shell基础二十篇 转自 http://bbs.chinaunix.net/thread-452942-1-1.html 研讨:Bash 内建命令 read (read命令更具体的说明见博客收藏的一 ...

  10. [老老实实学WCF] 第十篇 消息通信模式(下) 双工

    老老实实学WCF 第十篇 消息通信模式(下) 双工 在前一篇的学习中,我们了解了单向和请求/应答这两种消息通信模式.我们知道可以通过配置操作协定的IsOneWay属性来改变模式.在这一篇中我们来研究双 ...

随机推荐

  1. 北京Uber优步司机奖励政策(4月8日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. Ruby学习系列一,基本认识

    安装Ruby后,打开命令行,先来看下Ruby的版本. ruby -v ,如果看到类似 ruby 1.9.3p392.... ,说明我们的Ruby安装成功了. 然后我们输入 irb ,进入Ruby的交互 ...

  3. 创龙DSP6748开发板上电测试-第一篇

    1. 创龙DSP6748开发板测试.2980元的售价很高,我估计新的1200元比较合适,当然创龙定价是按照供需关系的.仿真器XDS100V2卖598元,真是狮子大张口. 2. 上电是5V-2A的电源. ...

  4. 微信小程序学习笔记(1)- 按钮触发的函数的定义以及不同页面之间的数据传递

    <view class='item' bindtap='onCountryTab' data-idx='4'> 1)bindtap属性用来设置控件需要绑定的函数,函数用单引号括起来:. 2 ...

  5. Python入门编程中的变量、字符串以及数据类型

    //2018.10.10 字符串与变量 1. 在输出语句中如果需要出现单引号或者双引号,可以使用转义符号\,它可以将其中的歧义错误解释化解,使得输出正常: 2. 对于python的任何变量都需要进行赋 ...

  6. TPO-11 C1 Use the gym pass

    TPO-11 C1 Use the gym pass 第 1 段 1.Listen to a conversation between a student and a university emplo ...

  7. unity发布自定义分辨率

    如果你需要发布unity时想要使用自己设置的分辨率仅需要一下几个步骤: 打开Build Setting->PlayerSetting->Resolution and Presentatio ...

  8. 孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1

    孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1 (完整学习过程屏幕记录视频地址在文末) 要模拟进行浏览器操作,只用requests是不行的,因此今天了解到有专门的解决方案 ...

  9. sql server存储特殊字符解决办法

    好久没来院子了,最近在学java了,再加上项目比较紧,最近都没怎么上,其实这几天在项目中学到不少东西,都能写下来,但是久而久之就忘了,还是得养成及时总结的好习惯啊,还有有时间一定要把那个小项目整理下来 ...

  10. vivado使用感想

    寒假学了一学期vivado也没有学出什么名堂:为了调试龙芯的五级流水CPU,今天肝了一下午结果还把vivado给摸清楚了,果然是以目标为导向最能出成绩. vivado开发硬件的流程 写代码 模拟仿真s ...