
重学 Go 语言:进阶篇
文章平均质量分 90
27 章节内容解析 Go 语言进阶知识点;使用反汇编、编程范式推导 Go 核心原理;从架构思想层面解析 Go 语言每个细节;从 Go 语言背景知识到灵活使用,知其然知其所以然。
优惠券已抵扣
余额抵扣
还需支付
¥24.00
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
YJingLee
我的博客:http://lyj.cnblogs.com
展开
-
操作系统:进程与线程
进程、线程的区别在编程中最常见的三个概念是进程、线程、协程。程序包含一系列资源,比如代码、图片、音视频、安装文件,程序是为了运行一段代码所需资源的总和。进程严格上说也是资源的集合,相对于程序静态资源来说,进程大多是动态资源,比如运行期的虚拟内存空间,正在执行 CPU 缓存的数据,这些资源总和称之为进程,进程是一种资源单位,操作系统为资源单位做管理。线程是和 CPU 交互的,线程是由进程的组...原创 2020-10-28 16:10:16 · 227 阅读 · 0 评论 -
操作系统:协程和上下文切换
首先,我们明确一个观点:程序的用线程来执行的。同步执行序如上图用户线程执行的一段时间片,线程从起点 A 开始执行,执行用户代码到终点 B 结束,执行到 C 点需要执行系统调用,用户线程就会在 C 点阻塞,执行序进入系统内核状态,剩下的时间片在系统内核执行。执行系统调用是操作系统内核的异步调用,系统内核的时间片是由操作系统提供的内部时间片。系统调用不使用剩下的时间片,在用户线程阻塞,剩下的用...原创 2020-10-28 16:10:17 · 570 阅读 · 0 评论 -
运行时:内存分配器
我们在做架构设计的时候,时时刻刻记住抽象。早期编码没有驱动程序一说,屏幕显示文字则需要把数据写到显卡内存里输出,后来操作系统做一层抽象,我们不需要和硬件打交道,只和驱动程序API打交道。可以同时运行多个程序,操作系统基于时间片切换,从协作式调度变成抢占式调度,这其实也是抽象。运行时现代编程语言大部分有运行时,类似在操作系统之上再抽象出一层虚拟机,它接管着很多东西,比如内存、垃圾回收、甚至包含并...原创 2020-10-28 16:10:17 · 195 阅读 · 0 评论 -
运行时:垃圾回收器
垃圾回收器相当于程序手动释放内存,从引用计数到现代各种方式,它的理论基础并没有很大差别。Go 垃圾回收器源码不适合作为学习的范例。垃圾回收消耗最多的时间是扫描对象,看对象是否活着的,是不是有其他对象引用,有引用就是活着的没有引用就是死的。垃圾回收器不关心对象有多大,它关心是对象的数量,也就是对象数量越多垃圾回收扫描时间就会越长,怎么样才能让它每次扫描的数量少一点呢?代龄和垃圾清理两种机制都是为...原创 2020-10-28 16:10:17 · 178 阅读 · 0 评论 -
运行时:并发调度
严格来说 goroutine 不能从字面层来翻译称之为协程,它实际上是一套相对完整的虚拟机。goroutine 模型Go 语言的 goroutine 模型相对来说设计的不错,goroutine 模型使用的是多对多模型。多对多模型被一些操作系统一些语言 Rust、Java 抛弃,而改用一对一模型,因为一对一模型性能高,但是对于海量的并发操作未必是最优秀的。Go 语言更适合 IO 密集型,对 C...原创 2020-10-28 16:10:18 · 275 阅读 · 0 评论 -
运行时:系统监控
系统监控本身是一种守护方式来确保有些事情必须要处理。系统监控的用途现在很多编程框架都是基于 epoll 来实现异步方式,但是我们有个程序对 epoll 做检查,这种检查要不自己执行,要么写个定时器定期的扫描,然后看看有哪些句柄是返回的。只不过这东西在 Go 的 runtime 是系统监控做这件事。runtime 三大组件,内存分配器、垃圾回收器、goroutine 调度。实际上除此之外还有系...原创 2020-10-28 16:10:19 · 759 阅读 · 0 评论 -
并发:并发与并行
并发和并行了解并发 (concurrency) 和并行 (parallesim) 的区别。并发:逻辑上具备同时处理多个任务的能力。并行:物理上在同一时刻执行多个并发任务。并发是并行的基础,并行是并发的理想执行模式。单核(多线程)或单线程(协程)可通过任务切换实现并发。多线程和多进程是并行的必备条件。并发编程模型现在属于必备的知识。现代语言都在简化并发编程模型,并发编程本身也引发出...原创 2020-10-28 16:10:19 · 391 阅读 · 0 评论 -
并发:并发任务单元
并发任务单元go func(s string) {println(s) }("hello")go 语句创建并发任务单元(goroutine),并打包函数执行所需参数。并发任务稍后由调度器调度执行。进程内所有用户代码均以 goroutine 方式执行。创建 goroutine 后,不阻塞。任务单元自带栈内存(2KB-1GB)。Go 语言写并发非常容易,因为所有的用户代码都是...原创 2020-10-28 16:10:20 · 248 阅读 · 0 评论 -
并发:通道
编程就是把具体实现抽象,屏蔽底层的一些细节。数据就像一条流水线,从一个并发单元传递到另一个并发单元。那么我们怎么传递数据呢?基于内存共享或者基于网络传输?数据共享方式同一进程内有不同的并发单元,例如 goroutine A 和 goroutine B,它们可能在不同的物理核上并发执行,如果访问同一个变量数据,A 读写数据时 B 不能写入,同理 B 读写数据时 A 就不能写入,否则会产生数据竞...原创 2020-10-28 16:10:20 · 302 阅读 · 0 评论 -
并发:同步
同步概况同步是并发最后一个环节。当两个并发单元共享同一个数据的时候需要同步处理。这里的并发单元不限于进程中的两个线程,也可能两个进程,甚至两台服务器。同步处理不局限共享同一块内存,当两个进程共享同一个文件给文件加锁都是同步处理,在数据库中启动一个事务或者启动乐观锁都是同步处理。共享同一资源产生数据竞争都需要做同步处理。标准库 sync 包专门用来做同步的,它由条件、锁,锁分为互斥和读写,Wa...原创 2020-10-28 16:10:21 · 448 阅读 · 0 评论 -
标准库:IO
IO 操作我们在类 Unix 系统下大多数都是 IO 操作,比如 web 应用、数据库操作、文件读写,Linux 核心思想是把一切当作文件。IO 操作一般分为两套,一套是操作系统提供的系统 IO,一套是标准库提供的缓冲 IO。IO 操作不仅仅是读写数据,它提供的是所谓数据流的概念。不要提到 IO 就想到读写文件,很多东西都可以流化,它更像一种设计模式或者模型。数据流的核心是连续性的数据,数据...原创 2020-10-28 16:10:22 · 196 阅读 · 0 评论 -
标准库:Context
上下文上下文不太好理解,因为上下文在不同地方不同说法显得有点太过于抽象,多数情况下上下文指的是完成一个行为所需要的环境。这个行为可能是一段逻辑,也可能是某一个调用,甚至是进程和线程的切换,甚至是用户空间到系统空间的切换。这个环境可能包含保存寄存器相关的执行信息,这些信息确保行为可以正常执行或者回溯。也就是说在不同的场合有明确的定义,但是我们很难把它具象化,需要根据上下文来判断上下文。就 cont...原创 2020-10-28 16:10:22 · 210 阅读 · 0 评论 -
标准库:Web
33.1 Web 框架现在大家做的大部分工作都和 Web 开发有关系,我们学习的不是怎么使用 Go 语言来写一个 Web 程序,我们关键是通过 Web 开发分清楚对于一个复杂的系统我们要去怎么样去鉴定各自的边界,我们知道 Web 开发包含的内容非常的多,我们需要做的是怎么样把这些功能整合到一起,它们各自边界是什么,它们各自相关代码的流程是什么,这些东西没有什么复杂度的问题,关键要搞清楚流程。我...原创 2020-10-28 16:10:23 · 215 阅读 · 0 评论 -
标准库:DB 数据库
数据库设计思想数据库设计是很典型的案例,通常我们用它作为学习的样本,在设计中有些模式也会被鉴戒或者被引入其他的领域。首先数据库本身是非常庞大而复杂的概念,跟数据库相关的东西很多,如何在不同类型数据库之间抽象出很好的设计是很难的事情。标准库提供的是 API 设计而不是框架设计,跟数据库相关的框架可能是利用辅助类型快速创建 SQL 语句,读写操作类似 ORM 框架,但是标准库并不会提供这些。任何一种...原创 2020-10-28 16:10:23 · 758 阅读 · 0 评论 -
组织:工作空间
项目目录组织(namespace)大多数人对于工作空间的概念依赖某些框架、某些工具定义好的生成规则,这种规则最早来源 IDE 时代。比如我们用 VS 创建一个项目 VS 创建对应的工作空间,创建各种各样的目录,很多时候只是往命名空间里添加文件,很少真正意义上的组织工作空间目录。很多操作系统源码对工具的依赖很低,它的目录组织都是基于人工的。对于项目管理需要摆脱工具或者框架的规则,换一种方式去管理...原创 2020-10-28 16:10:24 · 519 阅读 · 0 评论 -
组织:访问权限
访问权限封装的思想就是把一些状态打包只看到该看到的东西。我们把程序分为不同的类型和包,就出现是否允许访问的问题,甚至出现在同一个命名空间是否允许访问的问题。不同的语言对于访问权限做法不一样,C 语言没有访问权限的概念,所有的方法都可以通过头文件的符号访问。访问权限控制是编译器的概念。编译器通过识别访问权限,决定代码调用是否合法,编译是否成功。因为语言访问权限和基于文件系统或者操作系统的访问权...原创 2020-10-28 16:10:24 · 202 阅读 · 0 评论 -
动态:反射
动态行为动态语言没有反射的概念,因为动态语言按照名称或者符号表寻址,它的一切都是动态的。那么为什么出现反射这种技术呢?是因为静态语言在动态行为上有很大不足。泛型不属于动态行为。泛型本身是一种基于模板的机制,相当于带有占位符的代码模板交给编译器 JIT 翻译,用具体类型替换占位符生成多套不同的代码。动态通常是运行期的行为,一般用于调整算法、数据结构、解析未知的数据。注意解析 XML 或者 JS...原创 2020-10-28 16:10:25 · 624 阅读 · 0 评论 -
动态:动态语言
动态嵌入动态除了反射以外,还有另外一种实现方式,就是在程序中直接嵌入 Lua、V8 等动态语言引擎。大多数语言都有类似嵌入包,比如 Go 语言有 go-duktape、otto、golua、gopher-lua。嵌入 Python 动态语言比较少,因为 Python 引用计数机制比较麻烦,而且 Python 运行时环境太大不是基于嵌入设计。Lua 本身天生基于嵌入设计的,实现复杂的动态逻辑...原创 2020-10-28 16:10:25 · 253 阅读 · 0 评论 -
动态:CGO
CGO混合编程,在 Go 和 C 代码间相互调用:CGO 不是 Go直接在 Go 源文件内嵌入 C 代码直接编译(链接)C 源码文件导入动态库(.so)混合编程很常见,现在很多项目使用不同语言也是一种混合编程,只不过很少基于编译器混合编程。编译分成编译和链接部分。编译前端生成 .obj 文件,链接器生成可执行文件。换句话说,无论前端是什么语言,使用不同的前端翻译成同样格式的 ob...原创 2020-10-28 16:10:26 · 262 阅读 · 0 评论 -
测试:单元测试、性能测试、代码覆盖率、数据竞争、性能调优
测试是什么一个完整的软件有两个方面组成,第一是面向普通用户的软件产品,第二是面向公司的代码产品。代码需要不停更新迭代,也是一个产品。测试用于监管代码质量,测试本身也是算法,测试代码也需要维护和升级,测试和代码是相辅相成的。程序是算法加数据。简单的逻辑是一些算法指令,算法执行过程当中需要数据,这个数据可能在数据库里、也可能在文件里,算法和数据分离。测试也是,测试逻辑和测试数据分离。测试数据是场...原创 2020-10-28 16:10:27 · 418 阅读 · 0 评论 -
工具:GDB 调试器、常用工具、Go 工具链
工具链了解内置和扩展工具使用。开发环境安装及设置编译器(compile)和链接器(link)参数配套工具使用(get、vet)单元测试(testing)和性能工具(benchmark)调试器(dlv)及扩展工具(linter)使用安装$ GOROOT_BOOTSTRAP=/usr/local/go1.4 ./make.bash使用 apt、apk 安装(版本老旧)下载预...原创 2020-10-28 16:10:27 · 268 阅读 · 0 评论 -
工具:常用工具
原创 2020-10-28 16:10:28 · 327 阅读 · 1 评论 -
工具:Go 工具链
原创 2020-10-28 16:10:28 · 331 阅读 · 0 评论 -
前言:Go 文档之外,学习 Go 会遇到哪些问题?
我一直从事服务器后端系统开发快 10 年了,高并发分布式是互联网应用的基础,工作中先后使用过C#、Java、Go 等语言。当前工作需要把平台迁移到 Go,从零开始构建基础设施框架,在基础设施框架上开发各种业务系统。在迁移过程中逐步自研了一套功能完善的基础框架,同时也对语言的一些特性有了更深入的了解,所以便有了这个专栏。这个专栏的目的是如何把一门语言学精通了,什么叫精通,就是该会的东西都会了,让读...原创 2020-10-28 16:10:28 · 279 阅读 · 0 评论