Go 进阶 · 分布式爬虫实战
郑建勋
Go 语言技术专家,《Go 语言底层原理剖析》作者
15839 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 58 讲
Go 进阶 · 分布式爬虫实战
15
15
1.0x
00:00/00:00
登录|注册

02|内有乾坤:Go语言六大基础知识体系

你好,我是郑建勋。
这节课,我们继续来回顾 Go 语言的基础知识,帮助你在前期查漏补缺,打好项目开发的基础。在上节课,我把 Go 的基础知识分为了六个部分,分别是开发环境、基础语法、语法特性、并发编程、项目组织、工具与库。
现在,我们紧跟上节课的内容,继续后面四个部分的讲解。

语法特性

Go 语言中有许多特别的语法特性,其中比较主要的特性包括了 defer、接口、协程、通道等。让我们先从 defer 说起。

defer

defer 是 Go 语言中的关键字,也是 Go 语言的重要特性之一,defer 在资源释放、panic 捕获等场景中的应用非常广泛。
defer func(...){
// 实际处理
}()
我们需要掌握 defer 的几个重要特性,包括:
延迟执行;
参数预计算;
LIFO 执行顺序。
除此之外,Go 语言用于异常恢复的内置 recover 函数,也需要与 defer 函数结合使用才有意义:
func f() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
}
}()
fmt.Println("Calling g.")
g(0)
fmt.Println("Returned normally from g.")
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了Go语言的基础知识体系,包括语法特性和并发编程。在语法特性部分,重点介绍了defer、接口的基本用法和应用场景,以及接口的动态调用方式、嵌套、类型断言等知识点。并发编程部分则着重介绍了协程与通道的基本使用方式,以及传统的同步原语和Go语言提供的同步工具。此外,还提到了Go的依赖管理经历了长时间的演进,现如今Go Module已成为依赖管理的事实标准。文章还介绍了面向组合的设计哲学,以及Go语言的工具与库,包括代码分析与代码规范、代码测试等方面的工具。总的来说,本文通过详细介绍Go语言的基础知识体系,为读者提供了快速了解Go语言技术特点的概览。文章还介绍了一些常用的程序分析与调试的工具,如dlv、gdb、pprof、trace和gops,以及Go语言的标准库和第三方库。文章内容丰富,涵盖了Go语言的基础知识和相关工具,适合读者快速了解Go语言的技术特点。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 进阶 · 分布式爬虫实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • G55
    通过共享内存通信相当于双方必须依靠额外的控制机制来确保通信时内存中的内容是正确的,这一点需要共享双方设置同步机制,并不通用, 还容易有bug。但是通过通信共享内存则可以利用通用的通信基建, 凡是经过通信传递的信息一定是发送方确认正确的, 接收方只需要等待即可, 不用再依赖额外的同步机制,减少了出bug的机会。

    作者回复: 说得很好,通道一种所有权转移的机制,为我们屏蔽了锁等机制。 通过一些简单的并发模型(例如fan-in、fan-out),开发并行程序会变得非常容易

    2022-10-13归属地:北京
    14
  • 陈卧虫
    个人理解,内存是信息的载体,共享内存的目的就是为了传递信息,而共享内存只是传递信息的一种手段。共享内存的特点是信息存一块公共的内存区域的,每个线程主动来获取并竞争它的使用权,这个过程中就必须通过加锁来保证原子性。通过通信(channel)来共享内存,就是将线程的主动竞争变为了只能被动等待,接收信息,而消息只会传递给其中一个线程,谁拥有消息(从channel中获得),谁就拥有修改权,这样整个过程就不需要加锁。

    作者回复: 👍🏻这种所有权转移的机制非常妙哈,其实是通道为我们屏蔽了一些细节,非常有表现力

    2022-10-12归属地:北京
    10
  • 那时刻
    并行指的是同时做很多事情,并发是指同时管理很多事情。请问老师,管理和做具体区别是什么?

    作者回复: 同时管理很多事情指的是这些事情可能不是同时发生的,也不知道发生的先后顺序,但是通过一些调度让他们都有执行的机会。 而并行指的是当前时刻,事情同时在发生。 并发和并行是需要梳理的经典概念,CPU核心数量对应了能够并行执行的数量。但是一个机器上可能有上千上万的线程、协程在等待执行,他们其实是并发的

    2022-10-13归属地:北京
    9
  • 会飞的大象
    关于理解 ”不要通过共享内存来通信,通过通信来共享内存“ 这句话,个人理解,这是两种并发场景下的不同通信方式,本质都是为了达到共享信息的目的,而通过通信来共享内存,是为了解决共享内存机制本身在使用时带来的数据冲突和规避实现复杂度问题,两种方式的不同点在于,共享内存是通过主动读写同一块内存,而通信是被动接收消息及内容(有点类似消息队列)

    作者回复: 👏🏻👏🏻

    2022-10-23归属地:北京
    4
  • 范飞扬
    “不要通过共享内存来通信,通过通信来共享内存” 我老是觉得这是病句,因为按照常人的理解,“不要通过共享内存来通信”的下一句应该是“要通过XXX来通信”。那么这里的XXX是什么呢?还请老师解惑呀

    作者回复: 指的就是通信,即通道这种所有权转移的机制

    2022-10-30归属地:北京
    2
    2
  • 陈卧虫
    老师讲的所有权转移和rust中所有权类似吗

    作者回复: 不太一样哦,通道的所有权是为了解决并发安全,而rust中所有权是为了解决内存的泄露。通道的所有权底层是运行时用锁实现的,rust中所有权是借助编译器实现的

    2022-10-15归属地:北京
    2
  • 温雅小公子
    太贴心了吧,还有视频。

    作者回复: 😁哈哈,我后面有时间了还会陆续更新视频,现在全力搞专栏

    2022-10-12归属地:北京
    3
    2
  • includestdio.h
    想问下老师B站的视频完结了吗,我看好久没更新了 go 入门入了快一年了,看过各种 go 专栏和书籍,但是苦于没有实操经验,一直停留在理论,理论也是边学边忘,希望通过这门进阶课入门 -.-

    作者回复: 那是一个入门视频,现在我的尽力都在专栏上面,空了也会更新的哦。 其实看专栏就很好了呀,知识都凝聚在专栏了哦,其他的可作为参考资料

    2022-10-14归属地:北京
    1
  • Geek_b4e7f6
    新手报到

    作者回复: 冲鸭!

    2022-10-14归属地:北京
    1
  • 范飞扬
    感谢老师,很好的总结!
    2022-10-30归属地:上海
    2
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部