Go 语言核心 36 讲
郝林
《Go 并发编程实战》作者,前轻松筹大数据负责人
79610 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
Go 语言核心 36 讲
15
15
1.0x
00:00/00:00
登录|注册

15 | 关于指针的有限操作

意义在哪里
是否有意义
通过uintptr和unsafe.Pointer类型值访问和修改内部数据
使用unsafe.Offsetof获取内存中的偏移量
指针值和uintptr类型值之间的转换
限制在自增语句、赋值语句和for循环中的range子句
无法调用指针方法
无法使用取址操作符&
接收表达式的结果值
类型断言表达式的结果值
类型转换表达式的结果值
结构体字面量的字段值
函数字面量和方法字面量,以及对它们的调用表达式的结果值
对字典变量的索引表达式的结果值
对字符串变量的索引表达式和切片表达式的结果值
对各种字面量的索引表达式和切片表达式的结果值
算术操作的结果值
基本类型值的字面量
常量的值
通过指针值无缝地访问基本值的字段和调用关联的方法
方法的接收者是 *Dog 类型的
对于值不为 nil 的变量 dog,&dog 的结果是该变量的值的指针值
*Dog 是 Dog 的指针类型
引用类型的值的指针值的意义
通过unsafe.Pointer操纵可寻址的值
不可寻址值的限制
不可寻址的值列表
指针方法
指针类型及其对应的指针值
思考题
unsafe.Pointer的使用
问题解析
不可寻址的值
指针类型及其操作
Go语言中指针的有限操作

该思维导图由 AI 生成,仅供参考

在前面的文章中,我们已经提到过很多次“指针”了,你应该已经比较熟悉了。不过,我们那时大多指的是指针类型及其对应的指针值,今天我们讲的则是更为深入的内容。
让我们先来复习一下。
type Dog struct {
name string
}
func (dog *Dog) SetName(name string) {
dog.name = name
}
对于基本类型Dog来说,*Dog就是它的指针类型。而对于一个Dog类型,值不为nil的变量dog取址表达式&dog的结果就是该变量的值(也就是基本值)的指针值。
如果一个方法的接收者是*Dog类型的,那么该方法就是基本类型Dog的指针方法。
在这种情况下,这个方法的接收者,实际上就是当前的基本值的指针值。
我们可以通过指针值无缝地访问到基本值包含的任何字段,以及调用与之关联的任何方法。这应该就是我们在编写 Go 程序的过程中,用得最频繁的“指针”了。
从传统意义上说,指针是一个指向某个确切的内存地址的值。这个内存地址可以是任何数据或代码的起始地址,比如,某个变量、某个字段或某个函数。
我们刚刚只提到了其中的一种情况,在 Go 语言中还有其他几样东西可以代表“指针”。其中最贴近传统意义的当属uintptr类型了。该类型实际上是一个数值类型,也是 Go 语言内建的数据类型之一。
根据当前计算机的计算架构的不同,它可以存储 32 位或 64 位的无符号整数,可以代表任何指针的位(bit)模式,也就是原始的内存地址。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入讨论了Go语言中指针操作的相关概念和操作。首先介绍了指针类型及其对应的指针值,以及指针方法的概念。文章列举了不可寻址的值的类型及其限制,并介绍了通过`unsafe.Pointer`操纵可寻址的值的技术。强调了使用非正常编程手段的危险性,需要谨慎对待。总结部分重点强调了可寻址值的重要性和不可寻址值的限制,以及`unsafe.Pointer`类型和`uintptr`类型的潜在风险。读者可以通过本文快速了解Go语言中指针操作的相关概念和操作,以及需要注意的安全隐患。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言核心 36 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(53)

  • 最新
  • 精选
  • 郝林
    置顶
    大家可以具体说说有哪些名词需要用示例解释?
    2019-06-03
    1
    12
  • jacke
    字面量有人理解吗?求解释

    作者回复: 说白了就是用于表示值或者类型的代码段。比如:1234就是代表整数值的字面量,int64就是代表类型的字面量。很简单,不用想的太复杂。

    2018-10-13
    5
    33
  • 静水流深
    老师您好,引用类型的值的指针值,是否可以理解为指针的指针?

    作者回复: 你最好不要这么理解,否则会影响其他地方的理解。引用类型的值不是指针那么简单,它本身是有结构的,所以还是要按普通的值来理解,不要理解成指针。

    2019-07-18
    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 。

    2019-07-02
    3
    10
  • 有铭
    C里的指针是用来直接操作内存的,因为C里有大量的操作是必须靠操作内存完成的。那么go这种带有GC,不需要手动分配内存的语言,指针存在的意义在哪里呢,Go里的指针在何时有“不得不使用”的意义呢?

    作者回复: 没有非得使用的必要。指针类型及其值最常用,因为可以达到传址的效果。

    2018-09-14
    2
    9
  • 前面分类介绍那里,我感觉很绕,比如说,切片字面量的索引结果值,没看太懂,切片字面量是切片这个变量名称呢还是切片变量指向的值,索引结果值,是切片中索引指向的数据吗?还是这个索引本身的值呢?

    作者回复: 字面量,就是用来表示值本身的东西,比如:[]int32{1,2,3} 、"abc"等。索引结果值说全了是索引表达式的结果值,就是与给定的索引号对应的那个元素值。关于这些概念性名词,我记得都在文章里正面或侧面的解释过。如果你还有哪些不太明白,可以发评论问我。

    2019-08-15
    5
  • Michael
    “引用类型的值得指针值” 同C语言中 “指针的指针” 应该是一个概念; 假设,有一个值类型 T,那么类型T的引用类型就是:*T,引用类型值得指针值类型就是:**T。 var t = T{} // T var pt = &T // *T var ppt = &pt // **T 但是具体的意义与使用场景还没想到,也没有遇到过,若老师不嫌弃,还请老师指出

    作者回复: 在Go需要中所谓的指针的指针最好不要用,Go也是想避免这种复杂性才搞出来引用类型的。

    2018-09-17
    5
  • Alan
    New("little pig").SetName("monster") 这个应该看版本的吧,在1.13.5版本中是可以的

    作者回复: 这个是基本的规则,哪个版本都是一样的。

    2020-01-02
    3
    3
  • Realm
    1 “引用类型的值的指针 ”与 “引用类型的值的值指针”是两个概念? 2 值的值指针是类似切片、字典、通道内的元素的指针吗? 如果是,那老师的思考题,引用类型的值的值指针的意义:是不是用此指针来取元素的值?

    作者回复: 我没说过“值指针”这个词。“引用类型的值的指针值”的含义你不理解还是?

    2018-09-14
    2
    3
  • undifined
    老师 有一点没有理解,namePtr := dogPtr + unsafe.Offsetof(dogP.name)这里如果不知道这个属性是什么,怎么才能取到这个字段的便宜量呢

    作者回复: 不知道?不知道就没法取了。

    2018-09-14
    3
收起评论
显示
设置
留言
53
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部