Tony Bai · Go 语言第一课
Tony Bai
资深架构师,tonybai.com 博主
21492 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 59 讲
开篇词 (1讲)
结束语 (1讲)
Tony Bai · Go 语言第一课
15
15
1.0x
00:00/00:00
登录|注册

加餐|聊聊Go语言的指针

容纳任何指针的比特模式
计算指针类型大小
可以转换为任意指针类型
类似C语言中的void*
安全性考虑
不支持指针运算
不支持显式指针类型转换
传递开销小
可改变指向变量的值
改变指针指向
形参为指针
可以改变指针变量的指向
指向指针的指针
*p
与系统地址长度有关
&a
p = &a
nil
var p *T
特殊指针类型:unsafe.Pointer
基于类型T的指针类型为*T
指针是存储另一个变量地址的变量
回顾涉及指针的章节与实战项目
uintptr
Sizeof函数
unsafe.Pointer
限制
用途
指针与函数
二级指针
解引用
指针大小
取地址
赋值
零值
声明
类型
定义
思考题
unsafe包
指针用途与限制
指针进阶
指针基础
Go语言指针

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

你好,我是 Tony Bai。
刚刚完成专栏结束语,我又马不停蹄地开始撰写这篇加餐,因为在结束语中我曾提到过对专栏没有介绍指针类型的不安,如果你是编程初学者,或者只有动态语言的经验,又或者只有像 Java 这类不支持指针的静态语言编程的经验,缺少指针的讲解就可能会给你的学习过程带来一些困惑。
因此,在这一篇加餐中,我就来补上指针类型这一课。不过,我建议你不要把这篇当作加餐,而是当作本专栏必学的一节课
那么什么是指针呢?它和我们常见的 Go 类型,比如 int、string、切片类型等有什么区别呢?下面我们就来一探究竟!

什么是指针类型

和我们学过的所有类型都不同,指针类型是依托某一个类型而存在的,比如:一个整型为 int,那么它对应的整型指针就是 *int,也就是在 int 的前面加上一个星号。没有 int 类型,就不会有 *int 类型。而 int 也被称为 *int 指针类型的基类型
我们泛化一下指针类型的这个定义:如果我们拥有一个类型 T,那么以 T 作为基类型的指针类型为 *T
声明一个指针类型变量的语法与非指针类型的普通变量是一样的,我们以声明一个 *T 指针类型的变量为例:
var p *T
不过 Go 中也有一种指针类型是例外,它不需要基类型,它就是 unsafe.Pointer。unsafe.Pointer 类似于 C 语言中的 void*,用于表示一个通用指针类型,也就是任何指针类型都可以显式转换为一个 unsafe.Pointer,而 unsafe.Pointer 也可以显式转换为任意指针类型,如下面代码所示:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了Go语言中指针类型的概念和特点。通过详细的示例和解释,读者可以了解指针类型的声明、赋值和解引用操作,以及指针类型变量在内存中的存储方式。文章还讨论了指针变量的重新赋值和多个指针变量指向同一内存单元的情况。此外,文章还探讨了二级指针的概念和使用,以及指针在Go语言中的用途和使用限制。总的来说,本文为读者提供了深入了解Go语言中指针类型的使用和特性的基础知识。文章内容丰富,涵盖了指针类型的各个方面,对于想要深入学习和应用指针类型的读者来说,是一篇很有价值的文章。文章还提到了指针变量的声明与普通变量别无二异,指针变量的默认值为nil,以及Go语言对指针的使用做出的限制。建议读者在学完本文后回顾相关章节与实战项目,可能会有新的收获。

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

全部留言(15)

  • 最新
  • 精选
  • 青鸟飞鱼
    看完整个专栏,只能说一句,老师来极客时间开专栏,太晚了,期待新课

    作者回复: 感谢支持!

    2022-03-07
    2
    7
  • ly
    看完老师的课,对go的喜欢又多了一分,老师能不能出一门实战的课,系统设计加代码实现,感觉就这一门看不过瘾

    作者回复: 感谢支持👍。后续是否有课程,尚不确定:)

    2022-03-01
    2
    5
  • xiaoru
    二级指针例子中foo函数返回会栈桢空间不是应该被回收吗?为什么还能取到b中的值?

    作者回复: foo函数中的变量b不会被分配在栈上,会在堆上分配。这个go编译器会做逃逸分析(escape analysis)。

    2022-03-17
    4
  • 五彩斑斓的輝
    指针无论是在 Go 中,还是在其他支持指针的编程语言中,存在的意义就是为了是“可改变”。在 Go 中,我们使用 *T 类型的变量调用方法、以 *T 类型作为函数或方法的形式参数、返回 *T 类型的返回值等的目的,也都是因为指针可以改变其指向的内存单元的值。 可改变,怎么理解啊?如果不用指针也是可以改变的吧?

    作者回复: 这里可能表达不清。主要要表达的意思是通过指针传递参数与非指针传递参数的差别。非指针传递 改变的是拷贝,而不是原变量。

    2022-05-23
    2
    2
  • lesserror
    tony bai 老师,文中的这句话:“如果我们需要跨函数改变一个指针变量的指向,我们就不能选择一级指针类型作为形参类型了。因为一级指针只能改变普通变量的值,无法改变指针变量的指向。” 没有太理解,我通过传递一个变量的指针到另外一个函数中,然后在另外一个函数中,用另一个变量的指针地址是可以赋值的,但是函数外,传递的变量的指针没有改变,不知道为什么? 这块能在解释一下么?

    作者回复: 按照你的问题,写了一个例子: package main func foo(p *int) { var b int = 55 p = &b } func main() { var a int = 5 var p *int = &a println(*p) // 5 foo(p) println(*p) // 5 } 在这个例子中,main中的p和foo的参数p完全是两个不同函数栈上的变量,虽然foo参数p指向的也是main函数的变量a。 foo函数可以等价于: func foo() { var p *int var b int = 55 p = &b } foo的参数就等价于其函数内声明的本地变量。 所以foo内对p的修改,与main函数中的p并无关系。

    2023-05-27归属地:广东
    1
  • lesserror
    Tony bai 老师 ,文中有一处小错误。 在“多个指针变量可以指向同一个变量的内存单元的,这样通过其中一个指针变量对内存单元的修改,是可以通过另外一个指针变量的解引用反映出来的,比如下面例子:” 这段文字下面的代码中 : p2指向变量b所在内存单元 应该改为 p2指向变量a所在内存单元 的吧?

    作者回复: 的确是笔误,后续让编辑老师修改一下,感谢指出。

    2023-05-27归属地:广东
    1
  • crazyball
    催更大白老师进阶或实战课~

    作者回复: :)

    2023-02-03归属地:广东
    1
  • Elroy
    最开始看到课程的名字,误以为很基础,就随意翻了几篇感兴趣的看看,没想到干货满满,又从头看了一篇。讲的真好!

    作者回复: 👍😄

    2022-10-21归属地:北京
    1
  • piboye
    go2 会把macro加回来吗?

    作者回复: macro?go好像从来没有考虑加上macro。

    2022-10-09归属地:北京
    1
  • 心平气和
    期待白老师出一个实战课

    作者回复: 嗯嗯。后续看是否有机会:)

    2022-07-12
    1
收起评论
显示
设置
留言
15
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部