Go中的指针
学Java以来,让程序员忽略了指针和内存地址这些概念,Java帮我们封装了对象,简化了对象引用之间的关系。在Go语言中,又帮我们回忆起这些概念。
我们创建的每一个对象在内存中都有一个位置去存储,每个内存块都有一个地址表示当前位置,通常用十六进制表示,如0x24005676543。Go语言取地址的符号是&。放在一个变量前使用就会返回相应变量的内存地址。
比如下面的代码:
var a = 3
fmt.Printf("num is : %d, it's location in memory: %p\n", a, &a)
输出:
num is : 3, it's location in memory: 0xc000062080
可以看到&a输出了a的内存地址。
你可以将&a赋值给一个变量,然后观察这个变量的类型,使用reflect.TypeOf()方法:
var a = 3
intP = &a
b := &a
fmt.Println(reflect.TypeOf(b))
输出:
*int
可以看到&a的返回类型是 *int。
我们可以将一个变量的内存地址放在一个叫做指针的特殊数据类型中,声明一个指针的方式如下:
var p *int
然后我们可以使用p去指向一个内存地址:
p = &a
那么我们如何通过指针来获取对应内存地址的值呢,这也是有办法的。你可以在指针类型前面加上 * 号(前缀)来获取指针所指向的内容,这里的 * 号是一个类型更改器。使用一个指针引用一个值被称为间接引用。
var p *int
var a = 3
p = &a
fmt.Println(*p)
*p打印的是a的值。
当一个指针被定义没有分配任何变量的时候,它的值为nil。
对于任何一个变量val,如下表达式都是正确的:
var == *(&var)
有如下你需要注意的是,你不能获取到一个常量或者一个没有赋值操作的文字的内存地址:
const PI = 3.14
piP := &PI Cannot take the address of 'PI'
p2 := &3 Cannot take the address of '3'
在c语言中,指针是可以由程序员自行控制移动位置的,这无疑给程序增加了很多的不确定性,在Go中指针的概念其实更相当于是Java中的引用。它比Java中的引用高级之处在于:
Java中的参数传递,传递的是值的拷贝,但是在Go中你可以使用指针来传递这个值,它直接指向了这个值的内存地址,并且只占用了4个或者8个字节。
Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量 。如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址(变量名前面添加&符号,比如 &variable)传递给函数,这就是按引用传递 。此时传递给函数的是一个指针 。
Go中的指针的更多相关文章
- 【实战Java高并发程序设计 1】Java中的指针:Unsafe类
是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...
- c++中this指针的用法
1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将 ...
- 在c#中使用指针
如果想在c#中使用指针,首先对项目进行配置:在解决方案资源管理器中右击项目名选择属性(或在项目菜单中选择consoleApplication属性(consoleApplication为项名)),在生成 ...
- c中的指针
一. 指针前奏 1. 指针的重要性 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言. 2. 小需求 l void change(int n)函数 ...
- 关于Vector中的元素中含有指针成员的情况
对于容器,当容器的各个元素为类类型,且该类类型中含有指针成员时: 如果类类型的析构函数中包含了对指针变量指向内存的释放操作,则在利用clear()函数删除容器所有元素时,会自动调用类的析构函数,自动实 ...
- C++中this指针的用法详解
转自 http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响s ...
- C语言中的指针数组
C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...
- 转: 浅谈C/C++中的指针和数组(二)
转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...
- 转:浅谈C/C++中的指针和数组(一)
再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...
- C++中this指针的用法详解(转)
原文地址:http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影 ...
随机推荐
- Python编程菜鸟成长记--A1--04--Hello World!
1.重点知识 掌握使用 命令行.文件.Jupyter 的方式执行 Python 代码 2.Hello World! 自从 C 语言之父 丹尼斯.M.里奇 在<The C Programming ...
- Linux命令学习-tar命令
Linux中,tar命令的全称是tape archive,主要作用是压缩和解压文件. 参数说明: -c 创建新的压缩档案 -x 解压档案 -t 列出压缩档案的内容 -z 使用gzip来解压和压缩,文件 ...
- c++学习书籍推荐《C++ GUI Qt 4编程(第2版)》下载
下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 <C++ GUI Qt 4编程(第2版)>讲授的大量Qt4编程原理和实践,都可以轻易将其应用于Qt4.4.Qt4.5及后续版本的Q ...
- JAVA包装类解析和面试陷阱分析
包装类 什么是包装类 虽然 Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类型的数据不具备“对象”的特性——不携带属性.没有方法可调用. 沿用它们只是为了迎 ...
- java字符串的替换replace、replaceAll、replaceFirst的区别
看代码: String s = "my.test.txt"; System.out.println(s.replace(".", "#")) ...
- 零基础ASP.NET Core WebAPI团队协作开发
零基础ASP.NET Core WebAPI团队协作开发 相信大家对“前后端分离”和“微服务”这两个词应该是耳熟能详了.网上也有很多介绍这方面的文章,写的都很好.我这里提这个是因为接下来我要分享的内容 ...
- [POI2008]枪战Maf题解
问题 C: [POI2008]枪战Maf 时间限制: 1 Sec 内存限制: 256 MB 题目描述 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺 ...
- NOIP2015斗地主题解 7.30考试
问题 B: NOIP2015 斗地主 时间限制: 3 Sec 内存限制: 1024 MB 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共 ...
- 组件--button详解
一.wxss尺寸单位rpx rpx(responsive pixel): 可以根据屏幕宽度进行自适应.规定屏幕宽为750rpx. 严格按照XML语法. 二.icon 图标组件 <!--index ...
- ASP.NET CORE配置用户密码验证
在 class Startup 中配置 public void ConfigureServices(IServiceCollection services) { services.AddDbConte ...