15 | 关于指针的有限操作
郝林

在前面的文章中,我们已经提到过很多次“指针”了,你应该已经比较熟悉了。不过,我们那时大多指的是指针类型及其对应的指针值,今天我们讲的则是更为深入的内容。
让我们先来复习一下。
对于基本类型Dog来说,*Dog就是它的指针类型。而对于一个Dog类型,值不为nil的变量dog,取址表达式&dog的结果就是该变量的值(也就是基本值)的指针值。
如果一个方法的接收者是*Dog类型的,那么该方法就是基本类型Dog的指针方法。
在这种情况下,这个方法的接收者,实际上就是当前的基本值的指针值。
我们可以通过指针值无缝地访问到基本值包含的任何字段,以及调用与之关联的任何方法。这应该就是我们在编写 Go 程序的过程中,用得最频繁的“指针”了。
从传统意义上说,指针是一个指向某个确切的内存地址的值。这个内存地址可以是任何数据或代码的起始地址,比如,某个变量、某个字段或某个函数。
我们刚刚只提到了其中的一种情况,在 Go 语言中还有其他几样东西可以代表“指针”。其中最贴近传统意义的当属uintptr类型了。该类型实际上是一个数值类型,也是 Go 语言内建的数据类型之一。
根据当前计算机的计算架构的不同,它可以存储 32 位或 64 位的无符号整数,可以代表任何指针的位(bit)模式,也就是原始的内存地址。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言核心 36 讲》,新⼈⾸单¥59
《Go 语言核心 36 讲》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(53)
- 最新
- 精选
- 郝林置顶大家可以具体说说有哪些名词需要用示例解释?112
- jacke字面量有人理解吗?求解释
作者回复: 说白了就是用于表示值或者类型的代码段。比如:1234就是代表整数值的字面量,int64就是代表类型的字面量。很简单,不用想的太复杂。
532 - 静水流深老师您好,引用类型的值的指针值,是否可以理解为指针的指针?
作者回复: 你最好不要这么理解,否则会影响其他地方的理解。引用类型的值不是指针那么简单,它本身是有结构的,所以还是要按普通的值来理解,不要理解成指针。
19 - Geek_a8be59根据您说的 由于 Go 语言中的字符串值也是不可变的 var a = "123" var c = "123" fmt.Printf("a fist is %p\n",&a) a = "456" fmt.Printf("a two is %p \n",&a) b:=a fmt.Printf("a three is %p \n",&a) fmt.Printf("b is %p \n",&b) 我想问的是 ①这里的“123”和“456”值不可变,那是不是他们两个都是在常量区呢?我不清楚是不是有go有常量区这②如果字符串的值是不可变的,那么c和a的字符串的值的地址是一样的呢? ③那为什么&a != & c呢,这里是取的字面量a的地址么?是不是可以理解成*a才是真正字符串“123”的地址呢
作者回复: 1. Go 语言没有常量区这个概念。 2. 你要分清楚变量和值啊。变量本身的存储中包含了值,但不限于值。变量可以拥有或者代表一个值,但是它本身并不是值啊。 3. 你无法获取值 "123" 和 "456" 本身的存储地址,因为 Go 语言规范规定这样的值本身是不可取址的。 你可以参考 Go 运行时系统中对 string 结构的定义: type stringStruct struct { str unsafe.Pointer len int } 这个声明所在文件的路径是:/src/runtime/string.go 。
39 - 有铭C里的指针是用来直接操作内存的,因为C里有大量的操作是必须靠操作内存完成的。那么go这种带有GC,不需要手动分配内存的语言,指针存在的意义在哪里呢,Go里的指针在何时有“不得不使用”的意义呢?
作者回复: 没有非得使用的必要。指针类型及其值最常用,因为可以达到传址的效果。
29 - 浩前面分类介绍那里,我感觉很绕,比如说,切片字面量的索引结果值,没看太懂,切片字面量是切片这个变量名称呢还是切片变量指向的值,索引结果值,是切片中索引指向的数据吗?还是这个索引本身的值呢?
作者回复: 字面量,就是用来表示值本身的东西,比如:[]int32{1,2,3} 、"abc"等。索引结果值说全了是索引表达式的结果值,就是与给定的索引号对应的那个元素值。关于这些概念性名词,我记得都在文章里正面或侧面的解释过。如果你还有哪些不太明白,可以发评论问我。
5 - Michael“引用类型的值得指针值” 同C语言中 “指针的指针” 应该是一个概念; 假设,有一个值类型 T,那么类型T的引用类型就是:*T,引用类型值得指针值类型就是:**T。 var t = T{} // T var pt = &T // *T var ppt = &pt // **T 但是具体的意义与使用场景还没想到,也没有遇到过,若老师不嫌弃,还请老师指出
作者回复: 在Go需要中所谓的指针的指针最好不要用,Go也是想避免这种复杂性才搞出来引用类型的。
5 - AlanNew("little pig").SetName("monster") 这个应该看版本的吧,在1.13.5版本中是可以的
作者回复: 这个是基本的规则,哪个版本都是一样的。
32 - Realm1 “引用类型的值的指针 ”与 “引用类型的值的值指针”是两个概念? 2 值的值指针是类似切片、字典、通道内的元素的指针吗? 如果是,那老师的思考题,引用类型的值的值指针的意义:是不是用此指针来取元素的值?
作者回复: 我没说过“值指针”这个词。“引用类型的值的指针值”的含义你不理解还是?
22 - undifined老师 有一点没有理解,namePtr := dogPtr + unsafe.Offsetof(dogP.name)这里如果不知道这个属性是什么,怎么才能取到这个字段的便宜量呢
作者回复: 不知道?不知道就没法取了。
2
收起评论