Go语言指针

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

package main

imoprt "fmt"

func main() {
var a int = 10 fmt.Printf("变量的地址:%x\n", &a)
}

以上实例执行的结果为:

变量的地址: 20818a220

什么是指针

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

var var_name *var-type

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

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

如何使用指针

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

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

package main

import "fmt"

func main() {
var a int= 20 /* 声明实际变量 */
var ip *int /* 声明指针变量 */ ip = &a /* 指针变量的存储地址 */ fmt.Printf("a 变量的地址是: %x\n", &a ) /* 指针变量的存储地址 */
fmt.Printf("ip 变量储存的指针地址: %x\n", ip ) /* 使用指针访问值 */
fmt.Printf("*ip 变量的值: %d\n", *ip )
}

以上实例输出结果为:

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

Go空指针

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

package main

func main() {
var ptr *int fmt.Printf("ptr 的值为 : %x\n", ptr )
}

以上实例输出结果为:

ptr 的值为 : 0

空指针判断:

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

Go指针更多内容

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

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

Go语言指针数组

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

package main

import "fmt"

const MAX int = 3

func main() {
a := []int{10, 100, 200}
var i int for i = 0; i < MAX; i++ {
fmt.Printf("a[%d] = %d\n", i, a[i])
}
}

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

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

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

vat ptr [MAX]*int

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

package main

import "fmt"

const MAX int = 3

func main() {
a := []int{10, 100, 200}
var i int var ptr [MAX]*int for i = 0; i < MAX; i++ {
ptr[i] = &a[i] /* 整数地址赋值给指针数组 */
} for i = 0; i < MAX; i++ {
fmt.Printf("a[%d] = %d\n", i, *ptr[i])
}
}

以上代码输出结果为:

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

Go语言指向指针的指针

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

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

var ptr **int

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

package main

import "fmt"

func main() {
var a int
var ptr *int
var pptr **int a = 3000 /* 指针ptr地址 */
ptr = &a /* 指向指针ptr地址 */
pptr = &ptr /* 获取pptr的值 * /
fmt.Printf("变量 a = %d\n", a)
fmt.Printf("指针变量 *ptr = %d\n", *ptr)
fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr)
}

以上实例执行结果为:

变量 a = 3000
指针变量 *ptr = 3000
指向指针的指针变量 **pptr = 3000

Go语言指针作为函数参数

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

package main

import "fmt"

func main() {
/* 定义局部变量 */
var a int = 100
var b int= 200 fmt.Printf("交换前 a 的值 : %d\n", a )
fmt.Printf("交换前 b 的值 : %d\n", b ) /* 调用函数用于交换值
* &a 指向 a 变量的地址
* &b 指向 b 变量的地址
*/
swap(&a, &b); fmt.Printf("交换后 a 的值 : %d\n", a )
fmt.Printf("交换后 b 的值 : %d\n", b )
} func swap(x *int, y *int) {
var temp int
temp = *x /* 保存 x 地址的值 */
*x = *y /* 将 y 赋值给 x */
*y = temp /* 将 temp 赋值给 y */
}

以上实例运行结果为:

交换前 a 的值 : 100
交换前 b 的值 : 200
交换后 a 的值 : 200
交换后 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. Java设计模式(5)——创建型模式之建造者模式(Builder)

    一.概述 概念 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.(与工厂类不同的是它用于创建复合对象) UML图   主要角色 抽象建造者(Builder)——规范建造方法与结果 ...

  2. SLAM前沿问题梳理

    鲁棒性问题:数据关联是影响系统鲁棒性的主要原因 特征提取.线特征 短期内的数据关联是最容易处理的,新的研究方向包括特征提取.线特征等. 回环检测 对于前端的环闭合检测,检测当前测量中的特征并试图将它们 ...

  3. MySQL高级-锁机制

    一.概述 1.定义 2.锁的分类 ①从对数据操作的类型(读\写)分 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响. 写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁 ...

  4. 为什么测试人员必须掌握Linux?

    相信点进来的小伙伴不是对Linux感兴趣就是对测试感兴趣了,也希望本文可以帮助之前接触过Linux的小伙伴找到继续坚持学习下去的动力,之前没接触过Linux的小伙伴也能找到开始学习Linux的兴趣. ...

  5. Selenium自动化测试第一天(上)

    如有任何学习问题,可以添加作者微信:lockingfree 目录 Selenium自动化测试基础 Selenium自动化测试第一天(上) Selenium自动化测试第一天(下) Selenium自动化 ...

  6. Fiddler使用总结(三)

    我们知道Fiddler是位于客户端和服务器之间的代理,它能够记录客户端和服务器之间的所有 HTTP请求,可以针对特定的HTTP请求,分析请求数据.设置断点.调试web应用.修改请求的数据,甚至可以修改 ...

  7. 剑指offer-包含min函数的栈20

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). class Solution: def __init__(self): self.st ...

  8. vim常用命令—撤销与反撤销

    命令模式下(即按ESC后的模式) u 撤销 Ctrl r (组合键) 反撤销<后悔撤销>

  9. HADOOP docker(七):hive权限管理

    1. hive权限简介1.1 hive中的用户与组1.2 使用场景1.3 权限模型1.3 hive的超级用户2. 授权管理2.1 开启权限管理2.2 实现超级用户2.3 实现hiveserver2用户 ...

  10. POJ 1739 Tony's Tour(插头DP)

    Description A square township has been divided up into n*m(n rows and m columns) square plots (1< ...