 Go Context原理及其典型适用场景Context原理及其适用场景 随手记 李帅(飞雪无情) n 常见并发模式 n Context实现原理 n TLS VS Context n 典型适用场景 大纲 Channel Fan-in func fanIn(sum1, sum2 <-chan int) <-chan int { sum := make(chan int) go func() { for {sum <- <-sum1} 如果我们的任务终止了,请求取消了,这些正在运行 的goroutine怎么办? l 使用Context来简化这些操作 Context能做什么 u 手动、定时、超时发出取消信号 u 跨API传值 u 控制生成Context树结构(Context链) Context func main() { rootCtx := context.Background() ctx, cancel := context return c.val } return c.Context.Value(key) } 标准库使用 net/http database/sql os/exec 日志跟踪 l 触发点生成TraceId l 通过context.WithValue保存TraceId l 然后Context作为参数在多个groutine或者其他函数间 传递 l 达到日志跟踪的目的 日志跟踪调用链0 码力 | 32 页 | 4.62 MB | 1 年前3 Go Context原理及其典型适用场景Context原理及其适用场景 随手记 李帅(飞雪无情) n 常见并发模式 n Context实现原理 n TLS VS Context n 典型适用场景 大纲 Channel Fan-in func fanIn(sum1, sum2 <-chan int) <-chan int { sum := make(chan int) go func() { for {sum <- <-sum1} 如果我们的任务终止了,请求取消了,这些正在运行 的goroutine怎么办? l 使用Context来简化这些操作 Context能做什么 u 手动、定时、超时发出取消信号 u 跨API传值 u 控制生成Context树结构(Context链) Context func main() { rootCtx := context.Background() ctx, cancel := context return c.val } return c.Context.Value(key) } 标准库使用 net/http database/sql os/exec 日志跟踪 l 触发点生成TraceId l 通过context.WithValue保存TraceId l 然后Context作为参数在多个groutine或者其他函数间 传递 l 达到日志跟踪的目的 日志跟踪调用链0 码力 | 32 页 | 4.62 MB | 1 年前3
 2.Go语言实现中的几个研究课题_毛康力Go发布1.0时开始关注 • 最早接触是在2012年 • 喜欢研究底层实现 • http://www.zenlife.tk/ 有同事称我⼤大神或⼤大师(湿?) 其实,我只是⼀一个研究僧 ⼤大纲 • 并发 • 接⼝口 • 垃圾回收 • 调度 • 死锁检测 并发 • goroutine提供轻量的并发机制 • channel⽤用于goroutine之间通信 并发 goroutine 共享⼀一个全局锁? select • 研究课题:能否实现lock-free channels? • 使⽤用前获取select中的所有channel的锁 • 按channel结构体的地址顺序加锁 ⼤大纲 • 并发 • 接⼝口 • 垃圾回收 • 调度 • 死锁检测 接⼝口 • 接⼝口定义了⼀一系列⽅方法 • 如果类型实现了这些⽅方法,它就实现了这个接⼝口 • 接⼝口不依赖实现 C说:我不管。(使⽤用者累) • C++把同⼀一个函数(的不同类型)实现了很多遍。(编译器累) • Java把所有东⻄西都打包了,只有⼀一个函数。(运⾏行时累) • 研究课题:怎么样实现才合理? ⼤大纲 • 并发 • 接⼝口 • 垃圾回收 • 调度 • 死锁检测 垃圾回收 • ⺩王尼玛:内存管理太重要!交给机器我不放⼼心 • 曹尼玛:内存管理太重要!给⺩王尼玛管我不放⼼心0 码力 | 37 页 | 566.26 KB | 1 年前3 2.Go语言实现中的几个研究课题_毛康力Go发布1.0时开始关注 • 最早接触是在2012年 • 喜欢研究底层实现 • http://www.zenlife.tk/ 有同事称我⼤大神或⼤大师(湿?) 其实,我只是⼀一个研究僧 ⼤大纲 • 并发 • 接⼝口 • 垃圾回收 • 调度 • 死锁检测 并发 • goroutine提供轻量的并发机制 • channel⽤用于goroutine之间通信 并发 goroutine 共享⼀一个全局锁? select • 研究课题:能否实现lock-free channels? • 使⽤用前获取select中的所有channel的锁 • 按channel结构体的地址顺序加锁 ⼤大纲 • 并发 • 接⼝口 • 垃圾回收 • 调度 • 死锁检测 接⼝口 • 接⼝口定义了⼀一系列⽅方法 • 如果类型实现了这些⽅方法,它就实现了这个接⼝口 • 接⼝口不依赖实现 C说:我不管。(使⽤用者累) • C++把同⼀一个函数(的不同类型)实现了很多遍。(编译器累) • Java把所有东⻄西都打包了,只有⼀一个函数。(运⾏行时累) • 研究课题:怎么样实现才合理? ⼤大纲 • 并发 • 接⼝口 • 垃圾回收 • 调度 • 死锁检测 垃圾回收 • ⺩王尼玛:内存管理太重要!交给机器我不放⼼心 • 曹尼玛:内存管理太重要!给⺩王尼玛管我不放⼼心0 码力 | 37 页 | 566.26 KB | 1 年前3
 Go Web编程go get github.com/russross/blackfriday 这样读者就可以把相应的Markdown文件编译成html文件,执行go build build.go,执行生成的文件,就会在底目 录下生成相应的html文件 交流 交流 欢迎大家加入QQ群:259316004 《Go Web编程》专用交流群 大家有问题还可以上德问上一起交流学习:http://www.dewen ATH时,默认会将go get的内容放在第一个目录下 以上 $GOPATH 目录约定有三个子目录: src 存放源代码(比如:.go .c .h .s等) pkg 编译后生成的文件(比如:.a) bin 编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中) 以后我所有的例子都是以mygo作为我的gopath目录 应用目录结构 应用目录结构 建立包和目录:$ Printf("Hello, world. Sqrt(2) = %v\n", mymath.Sqrt(2)) } 12 如何编译程序呢?进入该应用目录,然后执行`go build`,那么在该目录下面会生成一个mathapp的可执行文件 sh ./mathapp 输出如下内容 sh Hello, world. Sqrt(2) = 1.414213562373095 `` 如何安装该应用,进入该目录执0 码力 | 295 页 | 5.91 MB | 1 年前3 Go Web编程go get github.com/russross/blackfriday 这样读者就可以把相应的Markdown文件编译成html文件,执行go build build.go,执行生成的文件,就会在底目 录下生成相应的html文件 交流 交流 欢迎大家加入QQ群:259316004 《Go Web编程》专用交流群 大家有问题还可以上德问上一起交流学习:http://www.dewen ATH时,默认会将go get的内容放在第一个目录下 以上 $GOPATH 目录约定有三个子目录: src 存放源代码(比如:.go .c .h .s等) pkg 编译后生成的文件(比如:.a) bin 编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中) 以后我所有的例子都是以mygo作为我的gopath目录 应用目录结构 应用目录结构 建立包和目录:$ Printf("Hello, world. Sqrt(2) = %v\n", mymath.Sqrt(2)) } 12 如何编译程序呢?进入该应用目录,然后执行`go build`,那么在该目录下面会生成一个mathapp的可执行文件 sh ./mathapp 输出如下内容 sh Hello, world. Sqrt(2) = 1.414213562373095 `` 如何安装该应用,进入该目录执0 码力 | 295 页 | 5.91 MB | 1 年前3
 Go语言基础
Golang FundamentsGo语言基础 Golang Fundaments 中山大学 数据科学与计算学院 潘茂林 panml@mail.sysu.edu.cn 大纲 • Golang-设计哲学 • 基础知识学习 • Go语言的入门资源 • 本地项目工作空间组织 • 开始编程 Golang-设计哲学 我们需要什么样的语言 • 曾经 – 我们对包含大量代码的程序印象深刻。 – 我们努力在代码库中创建大型抽象。0 码力 | 21 页 | 851.30 KB | 1 年前3 Go语言基础
Golang FundamentsGo语言基础 Golang Fundaments 中山大学 数据科学与计算学院 潘茂林 panml@mail.sysu.edu.cn 大纲 • Golang-设计哲学 • 基础知识学习 • Go语言的入门资源 • 本地项目工作空间组织 • 开始编程 Golang-设计哲学 我们需要什么样的语言 • 曾经 – 我们对包含大量代码的程序印象深刻。 – 我们努力在代码库中创建大型抽象。0 码力 | 21 页 | 851.30 KB | 1 年前3
 Go 入门指南(The way to Go)解释器 第3章:编辑器、集成开发环境与其它工具 3.1 Go 开发环境的基本要求 3.2 编辑器和集成开发环境 3.3 调试器 3.4 构建并运行 Go 程序 3.5 格式化代码 3.6 生成代码文档 3.7 其它工具 3.8 Go 性能说明 3.9 与其它语言进行交互 第4章:基本结构和基本数据类型 4.1 文件名、关键字与标识符 4.2 Go 程序的基本结构和要素 4.3 协程的同步:关闭通道-测试阻塞的通道 14.4 使用 select 切换协程 14.5 通道、超时和计时器(Ticker) 14.6 协程和恢复(recover) 14.7 新旧模型对比:任务和worker 14.8 惰性生成器的实现 14.9 实现 Futures 模式 第 15 章 网络,模板和网页应用 15.1 tcp服务器 15.2 一个简单的网页服务器 15.3 访问并读取页面 15.4 写一个简单的网页应用 书栈(BookStack.CN) 构建 致谢 当前文档 《Go入门指南》 由 进击的皇虫 使用 书栈(BookStack.CN) 进行构建,生成于 2018-02-08。 书栈(BookStack.CN) 仅提供文档编写、整理、归类等功能,以及对文档内容的生成和导出工具。 文档内容由网友们编写和整理,书栈(BookStack.CN) 难以确认文档内容知识点是否错漏。如果您在阅读文档 获取知识的0 码力 | 466 页 | 4.44 MB | 1 年前3 Go 入门指南(The way to Go)解释器 第3章:编辑器、集成开发环境与其它工具 3.1 Go 开发环境的基本要求 3.2 编辑器和集成开发环境 3.3 调试器 3.4 构建并运行 Go 程序 3.5 格式化代码 3.6 生成代码文档 3.7 其它工具 3.8 Go 性能说明 3.9 与其它语言进行交互 第4章:基本结构和基本数据类型 4.1 文件名、关键字与标识符 4.2 Go 程序的基本结构和要素 4.3 协程的同步:关闭通道-测试阻塞的通道 14.4 使用 select 切换协程 14.5 通道、超时和计时器(Ticker) 14.6 协程和恢复(recover) 14.7 新旧模型对比:任务和worker 14.8 惰性生成器的实现 14.9 实现 Futures 模式 第 15 章 网络,模板和网页应用 15.1 tcp服务器 15.2 一个简单的网页服务器 15.3 访问并读取页面 15.4 写一个简单的网页应用 书栈(BookStack.CN) 构建 致谢 当前文档 《Go入门指南》 由 进击的皇虫 使用 书栈(BookStack.CN) 进行构建,生成于 2018-02-08。 书栈(BookStack.CN) 仅提供文档编写、整理、归类等功能,以及对文档内容的生成和导出工具。 文档内容由网友们编写和整理,书栈(BookStack.CN) 难以确认文档内容知识点是否错漏。如果您在阅读文档 获取知识的0 码力 | 466 页 | 4.44 MB | 1 年前3
 Go 入门指南(The way to Go)org/cmd/gofmt/。 3.6 生成代码文档 go doc 工具会从 Go 程序和包文件中提取顶级声明的首行注释以及每个对象的相关注释,并生成相关文 档。 它也可以作为一个提供在线文档浏览的 web 服务器,http://golang.org 就是通过这种形式实现的。 一般用法 go doc package 获取包的文档注释,例如: go doc fmt 会显示使用 godoc 生成的 fmt 包的 服务器。在命令行输入 godoc -http=:6060 ,然后使用浏览器打开 http://localhost:6060 后,你 就可以看到本地文档浏览服务器提供的页面。 godoc 也可以用于生成非标准库的 Go 源码文件的文档注释(第 9.6 章)。 如果想要获取更多有关 godoc 的信息,请访问该页面:http://golang.org/cmd/godoc/(在线版的第 三方包 godoc 等复杂的函数修改,工具则会给出文件名和代码行数的提示以便让开发人 员快速定位并升级代码。Go 开发团队一般也使用这个工具升级 Go 内置工具以及 谷歌内部项目的代 码。 go fix 之所以能够正常工作是因为 Go 在标准库就提供生成抽象语法树和通过抽象语法树对代码 进行还原的功能。该工具会尝试更新当前目录下的所有 Go 源文件,并在完成代码更新后在控制台输 出相关的文件名称。 go test 是一个轻量级的单元测试框架(第0 码力 | 380 页 | 2.97 MB | 1 年前3 Go 入门指南(The way to Go)org/cmd/gofmt/。 3.6 生成代码文档 go doc 工具会从 Go 程序和包文件中提取顶级声明的首行注释以及每个对象的相关注释,并生成相关文 档。 它也可以作为一个提供在线文档浏览的 web 服务器,http://golang.org 就是通过这种形式实现的。 一般用法 go doc package 获取包的文档注释,例如: go doc fmt 会显示使用 godoc 生成的 fmt 包的 服务器。在命令行输入 godoc -http=:6060 ,然后使用浏览器打开 http://localhost:6060 后,你 就可以看到本地文档浏览服务器提供的页面。 godoc 也可以用于生成非标准库的 Go 源码文件的文档注释(第 9.6 章)。 如果想要获取更多有关 godoc 的信息,请访问该页面:http://golang.org/cmd/godoc/(在线版的第 三方包 godoc 等复杂的函数修改,工具则会给出文件名和代码行数的提示以便让开发人 员快速定位并升级代码。Go 开发团队一般也使用这个工具升级 Go 内置工具以及 谷歌内部项目的代 码。 go fix 之所以能够正常工作是因为 Go 在标准库就提供生成抽象语法树和通过抽象语法树对代码 进行还原的功能。该工具会尝试更新当前目录下的所有 Go 源文件,并在完成代码更新后在控制台输 出相关的文件名称。 go test 是一个轻量级的单元测试框架(第0 码力 | 380 页 | 2.97 MB | 1 年前3
 Hello 算法 1.0.0b4 Golang版展示效果受限,可访问 hello‑algo.com 网页版以获得更优的阅读体验。 致谢 本书在开源社区众多贡献者的共同努力下不断成长。感谢每一位投入时间与精力的撰稿人,他们 是(按照 GitHub 自动生成的顺序):krahets, sjinzh, justin‑tse, Reanon, nuomi1, Gonglja, S‑N‑O‑ R‑L‑A‑X, danielsss, hpstory, RiverTwilight // === File: worst_best_time_complexity.go === /* 生成一个数组,元素为 { 1, 2, ..., n },顺序被打乱 */ func randomNumbers(n int) []int { nums := make([]int, n) // 生成数组 nums = { 1, 2, 3, ..., n } for i := 0; i < n; break } } return } 4.1.4. 数组典型应用 数组是最基础的数据结构,在各类数据结构和算法中都有广泛应用。 ‧ 随机访问:如果我们想要随机抽取一些样本,那么可以用数组存储,并生成一个随机序列,根据索引实 现样本的随机抽取。 ‧ 排序和搜索:数组是排序和搜索算法最常用的数据结构。例如,快速排序、归并排序、二分查找等都需 要在数组上进行。 4. 数组与链表 hello‑algo0 码力 | 347 页 | 27.40 MB | 1 年前3 Hello 算法 1.0.0b4 Golang版展示效果受限,可访问 hello‑algo.com 网页版以获得更优的阅读体验。 致谢 本书在开源社区众多贡献者的共同努力下不断成长。感谢每一位投入时间与精力的撰稿人,他们 是(按照 GitHub 自动生成的顺序):krahets, sjinzh, justin‑tse, Reanon, nuomi1, Gonglja, S‑N‑O‑ R‑L‑A‑X, danielsss, hpstory, RiverTwilight // === File: worst_best_time_complexity.go === /* 生成一个数组,元素为 { 1, 2, ..., n },顺序被打乱 */ func randomNumbers(n int) []int { nums := make([]int, n) // 生成数组 nums = { 1, 2, 3, ..., n } for i := 0; i < n; break } } return } 4.1.4. 数组典型应用 数组是最基础的数据结构,在各类数据结构和算法中都有广泛应用。 ‧ 随机访问:如果我们想要随机抽取一些样本,那么可以用数组存储,并生成一个随机序列,根据索引实 现样本的随机抽取。 ‧ 排序和搜索:数组是排序和搜索算法最常用的数据结构。例如,快速排序、归并排序、二分查找等都需 要在数组上进行。 4. 数组与链表 hello‑algo0 码力 | 347 页 | 27.40 MB | 1 年前3
 Go 2 Generics? A (P)reviewPolymorphism)根据实参类型生成不同的版本 ,支持任意数量的 调用。即泛型 func Add(a, b T) T{ return a+b } Add(1, 2) // 编译器生成 T = int 的 Add Add(float64(1.0), 2.0) // 编译器生成 T = float64 的 Add Add("1", "2") // 编译器生成 T = string return a 10 } 11 return b 12 } 关键设计 ● 通过 //go:generate 编译器指示来自动生成代码 ● 利用这一特性比较优秀的实现是 cheekybits/genny 评述 ● 维护成本 ● 需要重新生成代 码 ● 没有类型检查,需要程序员自行判断 2020 © Changkun Ou · Go 夜读 · Go 2 Generics? A 「泛型困境」其实是一个伪命题 ○ 牺牲运行时性能的做法显然不是我们所希望的 ● 不加以限制的泛型机制将 严重拖慢编译性能 ○ 什么时候才能决定一个泛型函数 应该编译多少份不同的版 本? ○ 不同的生成策略会遇到什么 问题? ● 加以限制的泛型机制将提高程序的可 读性 ○ 如何妥当的描述 对类型的限制? 泛型困境 [Russ Cox, 2009] C: void * C++: template0 码力 | 41 页 | 770.62 KB | 1 年前3 Go 2 Generics? A (P)reviewPolymorphism)根据实参类型生成不同的版本 ,支持任意数量的 调用。即泛型 func Add(a, b T) T{ return a+b } Add(1, 2) // 编译器生成 T = int 的 Add Add(float64(1.0), 2.0) // 编译器生成 T = float64 的 Add Add("1", "2") // 编译器生成 T = string return a 10 } 11 return b 12 } 关键设计 ● 通过 //go:generate 编译器指示来自动生成代码 ● 利用这一特性比较优秀的实现是 cheekybits/genny 评述 ● 维护成本 ● 需要重新生成代 码 ● 没有类型检查,需要程序员自行判断 2020 © Changkun Ou · Go 夜读 · Go 2 Generics? A 「泛型困境」其实是一个伪命题 ○ 牺牲运行时性能的做法显然不是我们所希望的 ● 不加以限制的泛型机制将 严重拖慢编译性能 ○ 什么时候才能决定一个泛型函数 应该编译多少份不同的版 本? ○ 不同的生成策略会遇到什么 问题? ● 加以限制的泛型机制将提高程序的可 读性 ○ 如何妥当的描述 对类型的限制? 泛型困境 [Russ Cox, 2009] C: void * C++: template0 码力 | 41 页 | 770.62 KB | 1 年前3 Hello 算法 1.2.0 简体中文 Go 版hello‑algo.com 3 图 0‑1 本书主要内容 0.1.3 致谢 本书在开源社区众多贡献者的共同努力下不断完善。感谢每一位投入时间与精力的撰稿人,他们是(按照 GitHub 自动生成的顺序):krahets、coderonion、Gonglja、nuomi1、Reanon、justin‑tse、hpstory、 danielsss、curtishd、night‑cruise、 linearLogRecur(n/2) + linearLogRecur(n/2) for i := 0; i < n; i++ { count++ } return count } 图 2‑13 展示了线性对数阶的生成方式。二叉树的每一层的操作总数都为 ? ,树共有 log2 ? + 1 层,因此时 间复杂度为 ?(? log ?) 。 第 2 章 复杂度分析 www.hello‑algo.com 39 图 // === File: worst_best_time_complexity.go === /* 生成一个数组,元素为 { 1, 2, ..., n },顺序被打乱 */ func randomNumbers(n int) []int { nums := make([]int, n) // 生成数组 nums = { 1, 2, 3, ..., n } for i := 0; i < n;0 码力 | 384 页 | 18.49 MB | 10 月前3 Hello 算法 1.2.0 简体中文 Go 版hello‑algo.com 3 图 0‑1 本书主要内容 0.1.3 致谢 本书在开源社区众多贡献者的共同努力下不断完善。感谢每一位投入时间与精力的撰稿人,他们是(按照 GitHub 自动生成的顺序):krahets、coderonion、Gonglja、nuomi1、Reanon、justin‑tse、hpstory、 danielsss、curtishd、night‑cruise、 linearLogRecur(n/2) + linearLogRecur(n/2) for i := 0; i < n; i++ { count++ } return count } 图 2‑13 展示了线性对数阶的生成方式。二叉树的每一层的操作总数都为 ? ,树共有 log2 ? + 1 层,因此时 间复杂度为 ?(? log ?) 。 第 2 章 复杂度分析 www.hello‑algo.com 39 图 // === File: worst_best_time_complexity.go === /* 生成一个数组,元素为 { 1, 2, ..., n },顺序被打乱 */ func randomNumbers(n int) []int { nums := make([]int, n) // 生成数组 nums = { 1, 2, 3, ..., n } for i := 0; i < n;0 码力 | 384 页 | 18.49 MB | 10 月前3 Hello 算法 1.1.0 Go版hello‑algo.com 3 图 0‑1 本书主要内容 0.1.3 致谢 本书在开源社区众多贡献者的共同努力下不断完善。感谢每一位投入时间与精力的撰稿人,他们是(按照 GitHub 自动生成的顺序):krahets、Gonglja、nuomi1、codingonion、Reanon、justin‑tse、hpstory、 danielsss、curtishd、night‑cruise linearLogRecur(n/2) + linearLogRecur(n/2) for i := 0; i < n; i++ { count++ } return count } 图 2‑13 展示了线性对数阶的生成方式。二叉树的每一层的操作总数都为 ? ,树共有 log2 ? + 1 层,因此时 间复杂度为 ?(? log ?) 。 第 2 章 复杂度分析 hello‑algo.com 39 图 2‑13 // === File: worst_best_time_complexity.go === /* 生成一个数组,元素为 { 1, 2, ..., n },顺序被打乱 */ func randomNumbers(n int) []int { nums := make([]int, n) // 生成数组 nums = { 1, 2, 3, ..., n } for i := 0; i < n;0 码力 | 383 页 | 18.48 MB | 1 年前3 Hello 算法 1.1.0 Go版hello‑algo.com 3 图 0‑1 本书主要内容 0.1.3 致谢 本书在开源社区众多贡献者的共同努力下不断完善。感谢每一位投入时间与精力的撰稿人,他们是(按照 GitHub 自动生成的顺序):krahets、Gonglja、nuomi1、codingonion、Reanon、justin‑tse、hpstory、 danielsss、curtishd、night‑cruise linearLogRecur(n/2) + linearLogRecur(n/2) for i := 0; i < n; i++ { count++ } return count } 图 2‑13 展示了线性对数阶的生成方式。二叉树的每一层的操作总数都为 ? ,树共有 log2 ? + 1 层,因此时 间复杂度为 ?(? log ?) 。 第 2 章 复杂度分析 hello‑algo.com 39 图 2‑13 // === File: worst_best_time_complexity.go === /* 生成一个数组,元素为 { 1, 2, ..., n },顺序被打乱 */ func randomNumbers(n int) []int { nums := make([]int, n) // 生成数组 nums = { 1, 2, 3, ..., n } for i := 0; i < n;0 码力 | 383 页 | 18.48 MB | 1 年前3
共 45 条
- 1
- 2
- 3
- 4
- 5














 
 