这里记录每周值得分享的 Go 语言相关内容,周日发布。
本周刊开源(GitHub: polaris1119/golangweekly[1] ),欢迎投稿,推荐或自荐文章/软件/资源等,请 提交 issue[2] 。
由于 今日头条 不支持外链,文中链接可以通过文末「 了解更多 」查看。
鉴于大部分人可能没法坚持把英文文章看完,因此,周刊中会尽可能推荐优质的中文文章。优秀的英文文章,我们的 GCTT 组织会进行翻译。
刊首语
go.dev:一个新的 Go 开发人员中心,提供了关于 Go 的学习资源等信息。这么好的东西,国内是不是应该有一个类似的针对本土化的站点呢?是的,我们已经在行动了: 这是仓库地址,有兴趣的可以加入我们,可加微信:274768166。
资讯
1、 大家用 Go 都做什么?Go 官方新发布的 Go.Dev 告诉你
北京时间 2019 年 11 月 14 日凌晨 1 点 16 分,Go 官方团队在 golang-nuts 邮件组宣布 go.dev 上线
2、 Helm 3.0 正式发布,Kubernetes 包管理器[3]
Helm 3.0 已经发布,该版本是 CLI 工具的最新主要版本,主要关注简单性、安全性和可用性。
3、 Gitea 1.10.0 发布[4]
是时候发布另一个重要版本了!我们很荣幸向世界展示 Gitea 1.10.0。
4、 OpenDiablo2:《暗黑破坏神 2》的开源重新实现[5]
这个牛逼了,Go 实现的开源 暗黑破坏神 2 游戏引擎。
5、 cilium 1.6 发布[6]
可 100% 替换 kube-proxy,基于套接字的负载平衡,通用 CNI 链接,本机 AWS ENI 支持。
6、 百度 万亿流量的转发引擎 BFE 开源了(Go 实现)
BFE(Baidu Front End,百度统一前端)是百度的统一七层流量转发平台。BFE 平台目前已接入百度大部分流量,每日转发请求接近 1 万亿,峰值 QPS 超过 1000 万。在 2019 年百度春晚红包活动中,BFE 平台在超大用户压力、数次流量波峰下平稳运行,保证了春晚红包活动的顺利进行。
7、 go-mir v1.0.2 发布,用 Go 结构体标签定义 handler 路由信息的辅助库[7]
go-mir v1 的架构大体是这样:
8、 GitHub Mobile 抢先体验篇(多图预警)
GitHub 终于官方宣布了将会推出自家研发的手机版应用:GitHub Mobile。
9、 gopls v0.2.0 发布[8]
据说性能还是有待优化。
问答
1、 结构体指针切片和结构体数组指针的区别?[9]
type Widget struct { id int attrs []string } //下面两种传参有什么区别? func doSomThing(ss *[]Widget){ } func doOtherThing(sp []*widget){ }
2、 golang 的接口指针为什么不能调用方法?[10]
type I interface { name() } type S struct{} func (*S) name() { } func TestInterface(t *testing.T) { var value I = &S{} value.name() //可以调用 var point = &value point.name() //不能调用 }
3、 golang 如何返回一个有序的 map 类型的数据[11]
golang 的 map 我们知道是无序的, 可是实际应用的时候, 我回经常需要返回一个有序的格式 比如 list 列表按时间分组排序, 这种的实现思路 应该如何呢?
4、 slice 地址问题[12]
你理解吗?
文章
1、 Go 为什么能成功?Rob Pike 认为做了这 5 件事
在《Go Time》第 100 期中,Rob Pike 和 Robert Griesemer(Go 的两位创建者)一起探讨了 Go 语言的成功经验。
2、 Leader 这样说对吗?还是自己动手验证 Go 逃逸分析
总结逃逸分析的各种情况。
3、 超详细的讲解 Go 中如何实现一个协程池
本文将通过 runtime 对 goroutine 的调度分析,帮助大家理解它的机理和发现一些内存和调度的原理和问题,并且基于此提出一种个人的解决方案 — 一个高性能的 Goroutine Pool(协程池)。
4、 两位 Go 大佬的对话引发的对 Race 的思考总结
开始煎鱼大佬和无闻大佬在讨论 go-ini/ini 这个库为什么不加个 WatchConfig 的功能呢?另一个加载配置文件的库 viper 有类似的功能。其实这是很常见的需求,不用修改代码, 修改一下配置文件即可实现热更配置。
5、 Go 项目实战:用 Go 语言构建 SQL 解析器
本文旨在对如何用 Go 语言构建 LL(1) 文法的解析器 ——此例用来解析 SQL 请求——作出简要的介绍。只需要读者具有极少的编程能力(函数、结构体、条件语句和 for 循环)。
6、 让数据库运行在 Markdown 文档中:这是真的吗?
TiDB Wasm 的后续。
7、 线上问题排查实战:容器中某 Go 服务 GC 停顿经常超过 100ms
实际线上问题的排查过程分享。
8、 Go 实现简单 TCP 扫描器
一篇关于 Go 实现 TCP 扫描器的文章。
9、 uber-go 漏桶限流器使用与原理分析[13]
uber 在 Github 上开源了一套用于服务限流的 go 语言库 ratelimit[14] , 该组件基于 Leaky Bucket(漏桶)实现。
10、 你不知道的 Go unsafe.Pointer uintptr 原理和玩法[15]
这个类型比较重要,它是实现定位和读写的内存的基础,Go runtime 大量使用它,但我们使用它是需要考虑清楚。
11、 go 的 text/template 源码解析[16]
go 的模板库一直缺少 indent 的功能,于是我决定自己造个轮子来解决这个问题。
12、 斗鱼基于 Golang 在高并发场景下的日志系统实践[17]
斗鱼的业务是经典的高并发场景,不仅要优化业务逻辑,同时还要提升日志等基础组件的性能。
13、 GitHub Universe 2019 Keynote 回顾
大会内容总结。
开源项目
1、 BadgerDB: Go 中的一种快速,可嵌入的 Key-Value 数据库[18]
BadgerDB 是一个用纯 Go 编写的可嵌入,持久和快速键值(KV)数据库。它是 Dgraph(快速, 分布式 图数据库)的基础数据库。它打算成为 RocksDB 等非基于 Go 的键值存储的高性能替代品。
2、 tview: 用于终端 UI 的 Rich Interactive Widget[19]
具有各种控件:文本视图,表视图,列表,flexbox 布局等的输入表单。这里有文章做 基本介绍[20] 。
3、 gev: 一个轻量、比 net 库更快的基于 Reactor 模式的非阻塞 TCP 网络库[21] (@ Allenxuxu[22] 投稿)
一个轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库,支持自定义协议,轻松快速搭建高性能服务器。
特点:
- 基于 epoll 和 kqueue 实现的高性能事件循环
- 支持多核多线程
- 动态扩容 Ring Buffer 实现的读写缓冲区
- 异步读写
- SO_REUSEPORT 端口重用支持
- 支持 WebSocket
- 支持定时任务,延时任务
- 支持自定义协议
4、 apns2[23]
适用于 Go 的 HTTP/2 Apple 推送通知服务(APN)推送提供程序——使用 APNs HTTP/2 协议将推送通知发送到 iOS,tvOS, Safari 和 OSX 应用程序。
5、 validator: Go Struct 和 Field 验证器,包括跨结构、Map、Slice 和数组等[24]
该验证器基于标签对结构和单个字段实现值验证。
6、 goreplay: 捕捉和重放 http 流量[25]
GoReplay 是一个开源网络监视工具,可以记录您的实时流量,并将其用于负载测试,监视和详细分析等。
7、 expr: 表达式编译和求值引擎[26]
可以在线试验:
8、 imgproxy[27]
一个 Go 语言写的图片代理网关,可以代理远程图片,并且提供格式转换和大小缩放功能。
9、 Shiori: 使用 Go 构建的简单书签管理器[28]
旨在作为 Pocket[29] 的简单克隆。您可以将其用作命令行应用程序或 Web 应用程序。该应用程序以单个二进制文件的形式分发,这意味着它可以轻松安装和使用。
10、 go2ast[30]
将 Go 代码转换为抽象语法树(AST)
11、 gothanks: 自动为你 go.mod 中的依赖项加注星标[31]
感谢其他 Go 模块维护者。
12、 RadVPN: 去中心化的分布式 VPN[32]
RadVPN 不需要任何中心点,因为它直接连接到其他节点(全网),并且具有内置的路由器,该路由器可以帮助数据包路由到适当的目的地。
13、 fastzip:快速创建和读取 zip 的库[33]
Fastzip 是一个 Zip 存档器和提取器,专注于速度。
14、 musig[34]
像 shazam 那样实现音乐识别。
15、 dcron: 分布式定时任务库 distributed-cron[35]
基于 redis 同步节点数据,模拟服务注册。然后将任务名 根据一致性 hash 选举出执行该任务的节点。
16、 wego: Go 实现的终端的天气应用[36]
17、 stack: Error 的堆栈跟踪[37]
与 fmt.Errorf 相同,但具有堆栈跟踪。
18、 gohack[38]
新 go module 机制将外部依赖缓存在本地只读目录中无法更改,如果要更改外部模块代码做 debug,gohack 可以来帮您。
资源&&工具
1、 go time: 用 Go 构建搜索工具[39]
Bleve 作者出席 gotime。
2、 gotime: 讨论代码编辑器[40]
Go 常用的编辑器就那几个吧。
3、 LXC 系统教程[41]
LXC 是 Linux 容器的一个运行时,可以看作 Docker 的替代品。本系列是 LXC 的一个作者写的如何上手的系列文章。
4、 《高性能 Go 代码工坊》中译[42]
原文[43] 是深入研究 Go 应用性能提升的英语系列文章,这里是中译。
5、 浏览器运行数据库是如何实现的?TiDB-Wasm 原理与实现
TiDB-Wasm 项目是 TiDB Hackathon 2019 中诞生的二等奖项目,实现了将 TiDB 编译成 Wasm 运行在浏览器里,让用户无需安装就可以使用 TiDB。
订阅
这个周刊每周日发布,同步更新在 Go 语言中文网[45] 、 微信公众号[46] 和 今日头条[47] 。
微信搜索”Go 语言中文网”或者扫描二维码,即可订阅。
推荐阅读
文中链接
[1]polaris1119/golangweekly:
[2]提交 issue:
[3]
Helm 3.0 正式发布,Kubernetes 包管理器:
[4]
Gitea 1.10.0 发布:
[5]
OpenDiablo2:《 暗黑破坏神2 》的开源重新实现:
[6]
cilium 1.6 发布:
[7]
go-mir v1.0.2 发布,用 Go 结构体标签定义 handler 路由信息的辅助库:
[8]
gopls v0.2.0 发布:
[9]
结构体指针切片和结构体数组指针的区别?:
[10]
golang 的接口指针为什么不能调用方法?:
[11]
golang 如何返回一个有序的map类型的数据:
[12]
slice地址问题:
[13]
uber-go漏桶限流器使用与原理分析:
[14]
ratelimit:
[15]
你不知道的Go unsafe.Pointer uintptr原理和玩法:
[16]
go的text/template源码解析:
[17]
斗鱼基于 Golang 在高并发场景下的日志系统实践:
[18]
BadgerDB: Go 中的一种快速,可嵌入的 Key-Value 数据库:
[19]
tview: 用于终端 UI 的Rich Interactive Widget:
[20]
基本介绍:
[21]
gev: 一个轻量、比 net 库更快的基于 Reactor 模式的非阻塞 TCP 网络库:
[22]
Allenxuxu:
[23]
apns2:
[24]
validator: Go Struct 和 Field 验证器,包括跨结构、Map、Slice 和数组等:
[25]
goreplay: 捕捉和重放 http 流量:
[26]
expr: 表达式编译和求值引擎:
[27]
imgproxy:
[28]
Shiori: 使用 Go 构建的简单书签管理器:
[29]
Pocket:
[30]
go2ast:
[31]
gothanks: 自动为你 go.mod 中的依赖项加注星标:
[32]
RadVPN: 去中心化的分布式 VPN:
[33]
fastzip:快速创建和读取zip的库:
[34]
musig:
[35]
dcron: 分布式定时任务库 distributed-cron:
[36]
wego: Go 实现的终端的天气应用:
[37]
stack: Error 的堆栈跟踪:
[38]
gohack:
[39]
go time: 用 Go 构建搜索工具:
[40]
gotime: 讨论代码编辑器:
[41]
LXC 系统教程:
[42]
《高性能 Go 代码工坊》中译:
[43]
原文: :
[44]
xiao.zhao@chaitin.com: mailto:xiao.zhao@chaitin.com
[45]
Go语言中文网:
[46]
微信公众号:
[47]
今日头条: #mid=1586087918877709