点击上方蓝色“Go语言中文网”关注我们,设个星标,每天学习 Go 语言
这里记录每周值得分享的 Go 语言相关内容,周日发布。
本周刊开源(GitHub:polaris1119/golangweekly[1]),欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue[2] 。
由于微信不允许外链,文中链接可以通过文末引用找到,或「阅读原文」查看。
鉴于大部分人可能没法坚持把英文文章看完,因此,周刊中会尽可能推荐优质的中文文章。优秀的英文文章,我们的 GCTT 组织会进行翻译。
题图:庐山三叠泉
刊首语
国庆节快乐!假期马上结束了,大家玩的开心吗?是时候收收心,进入学习状态了。可以从本周刊开始。
国庆期间爬了庐山,感慨风景和书上、听到的差距太多,水少了很多,大部分地方都没有水,景色少了很多迷人之处。感受到生态被破坏了很多很多,大家要多保护生态环境!
资讯
1、Go 1.14 将带来什么[3](英文)
自己科学上文查看。
2、gotime 讨论:Gophers 安全性[4]
Mat, Filippo, Johan, 和 Roberto 讨论了 Go 中的安全性。Go 能让您轻松保护代码吗?Gophers 犯了哪些常见错误?fuzzing 是什么?如果您使用默认的 HTTP 多路复用器,攻击者将如何滥用您的代码?
3、Elasticsearch 7.4.0 发布,分布式搜索和数据分析引擎[5]
Elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎。此版本更新内容较多。
4、Kong 2.0 Alpha 发布,支持 Go、数据与控制平面分离[6]
此版本包含 Golang 语言的 PDK 插件,除此之外,Kong 还表示将继续支持其它社区流行的语言进行开发。
5、基于 Golang 的后台管理框架 GoAdmin 将于 10 月 8 号发布 1.0 正式版[7]
目前越来越流行的 golang 语言编写的后台管理框架,能让你在十分钟内搭建起一个 crud 完善的后台管理系统。目前开发人员正在紧锣密鼓的开发中,1.0 正式版将于国庆后第一天发布。
GoAdmin
问答
1、如何在 golang http 服务端程序中读取 2 次 Request Body?[8]
有时候会有这样的需求吗?
2、Golang 发展到现在是否有类似 Python 那样数据分析和爬虫包呢?[9]
其实有挺多的这样的库的。
3、关于 go 框架 gin 的静态托管和 api 同时使用报错的问题[10]
gin 框架,我想使用 /,在打开网站的时候返回静态首页,使用其他比如/hello 的时候返回接口,我是新鸟啊,开发的时候遇到了问题,求解大家,谢谢!
4、go mod 怎么引用同一个项目下面的子目录[11]
怎么在 go 的子路径下面引用子包下面的函数?
5、Go 函数传参 []int 与 [3]int 有何区别?[12]
这个挺基础,但也重要。
6、go mod 机制到底如何运作的[13]
知其然并知其所以然,这样遇到问题才能更好的解决。
7、gorm 查询结构体不确定,如何动态传递结构体?[14]
有一个需求,用户配置查询 sql,查询结果入库表名,根据这个需求我创建了入库表结构体,查询 func、但是 golang 的方法参数必须指定类型,入库表类型我是不能确定的。这种需求大家怎么处理的?
文章
这篇文章推荐一个库,https://github.com/jianfengye/collection。这个库是我在开发业务过程频繁使用 Slice 结构,就产生了要做一个 Collection 包的想法。本文说说我开发这个库的前因后果。
在微服务架构中,调用链是漫长而复杂的,要了解其中的每个环节及其性能,你需要全链路跟踪。
之前一直写一些动态语言,觉得解析 JOSN 还是很简单的,往往只需要几行代码就能拿到解析好的 JSON 对象。Go 语言自带的 json 包可以让你在程序中方便的读取和写入 JSON 数据。生成 JSON 场景相对简单一些,json.Marshal()
会根据传入的结构体生成 JSON 数据。
4、你可能从来没有注意到的特性:Go 语言中的快速检查(quickcheck)测试
我们只能看到我们了解的东西。
在这篇博文中我们看到使用 go generate
和遍历抽象语法树来生成强大的枚举类型。
6、go 平滑重启调研选型和项目实践[15]
当线上代码需要更新时,我们平时一般的做法需要先关闭服务然后再重启服务。本文主要结合 linux 和 Golang 中相关实现来介绍如何选型与实践过程。
7、Golang 实现请求限流的几种办法[16]
简单的并发控制
使用计数器实现请求限流
使用 golang 官方包实现 httpserver 频率限制
使用 Token Bucket(令牌桶算法)实现请求限流
8、通过 Goalng 内存逃逸分析讨论 GC 的压力[17]
逃逸分析在编译阶段完成,逃逸分析目的是决定内分配地址是栈还是堆,通过了解了逃逸分析后,我们可以了解内存究竟是在 heap 上分配还是在 stack 上分配,从而更有效的利用 heap 内存,从而减轻 GC 压力。
本文将通过 gRPC + Opentracing + Zipkin 搭建一个分布式链路追踪系统来实现查看整个系统的链路、性能等指标。
10、go 学习笔记之 10 分钟简要理解 go 语言闭包技术
闭包是主流编程语言中的一种通用技术,常常和函数式编程进行强强联合,本文主要是介绍 Go 语言中什么是闭包以及怎么理解闭包。
11、go ctx 超时导致资源释放失败[18]
避免使用上下文通用的 ctx 来释放资源。
12、Go channel 实现原理分析[19]
channel 一个类型管道,通过它可以在 goroutine 之间发送和接收消息。它是 Golang 在语言层面提供的 goroutine 间的通信方式。Go 依赖于成为 CSP 的并发模型,通过 Channel 实现这种同步模式。Golang 并发的核心哲学是不要通过共享内存进行通信。
channel
13、go+realize 实现热更新[20]
习惯了 webpack 多年,Golang Web 开发环境中怎么能少了热更新功能呢,于是搜索发现一款还不错的工具,在我的 windows 机器上安装,过程中发现了三个坑,还好最终都解决了。
开源项目
1、ent: Facebook 开源的实体(entity)框架[21]
简单而强大的 ORM,用于建模和查询数据。
ent
2、sprig: 有用的 Go 模板函数[22]
Go 语言带有内置的模板语言,但是模板函数不是很多。Sprig 是一个提供 100 多种常用模板函数的库。它受到 Twig 和各种 JavaScript 库(例如 underscore.js)中的模板函数的启发。
3、dnscrypt-proxy: 灵活的 DNS 代理,支持加密的 DNS 协议[23]
支持 DNSCrypt v2 和 HTTP-over-HTTPS。
4、go-fuzz: Go 的随机测试[24]
Go-fuzz 是一种覆盖率指导的模糊测试解决方案,用于测试 Go 软件包。模糊测试主要适用于解析复杂输入(文本和二进制)的程序包,对于强化对可能来自潜在恶意用户(例如,网络上接受的任何内容)的输入进行解析的系统的加固特别有用。
5、packr: 将静态文件嵌入 Go 二进制文件的简便方法[25]
Packr 是在 Go 二进制文件中捆绑静态资源的简单解决方案。最重要的是,它以对开发人员友好的方式进行开发。
6、env: 简单的 lib 可以将环境变量解析为结构体[26]
type config struct {
Home string `env:"HOME"`
Port int `env:"PORT" envDefault:"3000"`
IsProduction bool `env:"PRODUCTION"`
Hosts []string `env:"HOSTS" envSeparator:":"`
Duration time.Duration `env:"DURATION"`
TempFolder string `env:"TEMP_FOLDER" envDefault:"${HOME}/tmp" envExpand:"true"`
}
func main() {
cfg := config{}
if err := env.Parse(&cfg); err != nil {
fmt.Printf("%+v\n", err)
}
fmt.Printf("%+v\n", cfg)
}
7、gontroller: 用于创建 k8s controller 的 Go 库(无需依赖 k8s 资源)[27]
Go 库用于创建 feedback loop/control controllers[28],或者换句话说,Go 库用于创建无需依赖 Kubernetes 资源的控制器。
8、golicense: 从编译的 Go 二进制文件中扫描和分析开源依赖关系和许可证[29]
golicense 是一种工具,可以扫描已编译的 Go 二进制文件,并可以输出所有依赖项、它们的版本以及各自的许可证(如果知道)。golicense 仅适用于使用 Go 模块进行依赖性管理的 Go 二进制文件。
9、rain: BitTorrent 客户端库和工具[30]
在 https://put.io 上投入使用。
10、go-spring: didi 开发人员开源的模仿 Java Spring 的 Go 应用程序开发框架[31]
Go-Spring 实现了两个非常核心的特性:IoC 容器和开箱即用
整理了一份目前 GUI/图形/图像相关的 Go 项目列表。
12、bigslice: 用于 Go 编程语言的无服务器集群计算系统[32]
Bigslice 是 Go 的无服务器集群数据处理系统。Bigslice 公开了可组合的 API,该 API 使用户可以通过调用用户代码的一系列数据转换来表达数据处理任务。然后,Bigslice 运行时使用 Bigmachine 库透明地并行化和分发工作,并在云提供商上创建一个临时群集。
资源&&工具
1、使用 Go 重振 Linux 编程课程[33](英文)
一篇英文论文。
2、GopherCon UK 2019 视频合集[34]
英文好的可以看看。
3、Go 云开发工具包[35]
Go Cloud 开发工具包(Go CDK)是一个开放源代码项目,用于构建库和工具,以改善使用 Go 开发云的体验。
4、在 Go 上精选的博客文章[36](英文)
这是有关 Go 的博客文章的阅读列表。它希望仅包含与 Go 相关的最有用和最相关的材料。
订阅
这个周刊每周日发布,同步更新在Go 语言中文网[37]、微信公众号[38] 和 今日头条[39]。
微信搜索"Go 语言中文网"或者扫描二维码,即可订阅。
推荐阅读
参考资料
polaris1119/golangweekly: https://github.com/polaris1119/golangweekly
[2]提交 issue: https://github.com/polaris1119/golangweekly/issues
[3]Go 1.14 将带来什么: https://docs.google.com/presentation/d/1HfIwlVTmVWQk94OLKfTGvXpQxyp0U4ywG1u5j2tjiuE/edit#slide=id.g550f852d27_228_0
[4]gotime 讨论:Gophers 安全性: https://changelog.com/gotime/101
[5]Elasticsearch 7.4.0 发布,分布式搜索和数据分析引擎: https://www.oschina.net/news/110323/elasticsearch-7-4-0-released
[6]Kong 2.0 Alpha 发布,支持 Go、数据与控制平面分离: https://www.oschina.net/news/110306/kong-2-0-alpha-released
[7]基于 Golang 的后台管理框架 GoAdmin 将于 10 月 8 号发布 1.0 正式版: https://www.oschina.net/news/110298/goadmin-to-release-1-0-at-1008
[8]如何在golang http服务端程序中读取2次Request Body?: https://www.zhihu.com/question/329045911/answer/714781838
[9]Golang 发展到现在是否有类似 Python 那样数据分析和爬虫包呢?: https://www.zhihu.com/question/316207016
[10]关于go框架gin的静态托管和api同时使用报错的问题: https://segmentfault.com/q/1010000020593317
[11]go mod怎么引用同一个项目下面的子目录: https://segmentfault.com/q/1010000020590559
[12]Go函数传参 []int 与 [3]int 有何区别?: https://segmentfault.com/q/1010000020543158
[13]go mod 机制到底如何运作的: https://segmentfault.com/q/1010000020519654
[14]gorm查询结构体不确定,如何动态传递结构体?: https://segmentfault.com/q/1010000020532050
[15]go平滑重启调研选型和项目实践: https://studygolang.com/articles/23728
[16]Golang实现请求限流的几种办法: https://blog.csdn.net/micl200110041/article/details/82013032
[17]通过Goalng内存逃逸分析讨论GC的压力: https://studygolang.com/articles/23711
[18]go ctx超时导致资源释放失败: https://segmentfault.com/a/1190000020549820
[19]Go channel 实现原理分析: https://www.jianshu.com/p/d841f251d3bc
[20]go+realize实现热更新: https://studygolang.com/articles/23756
[21]ent: Facebook开源的实体(entity)框架: https://github.com/facebookincubator/ent
[22]sprig: 有用的 Go 模板函数: https://github.com/Masterminds/sprig
[23]dnscrypt-proxy: 灵活的 DNS 代理,支持加密的 DNS 协议: https://github.com/DNSCrypt/dnscrypt-proxy
[24]go-fuzz: Go 的随机测试: https://github.com/dvyukov/go-fuzz
[25]packr: 将静态文件嵌入 Go 二进制文件的简便方法: https://github.com/gobuffalo/packr
[26]env: 简单的 lib 可以将环境变量解析为结构体: https://github.com/caarlos0/env
[27]gontroller: 用于创建 k8s controller 的 Go 库(无需依赖 k8s 资源): https://github.com/spotahome/gontroller
[28]feedback loop/control controllers: https://en.wikipedia.org/wiki/Control_theory
[29]golicense: 从编译的Go二进制文件中扫描和分析开源依赖关系和许可证: https://github.com/mitchellh/golicense
[30]rain: BitTorrent 客户端库和工具: https://github.com/cenkalti/rain
[31]go-spring: didi开发人员开源的模仿 Java Spring 的 Go 应用程序开发框架: https://github.com/didi/go-spring
[32]bigslice: 用于Go编程语言的无服务器集群计算系统: https://github.com/grailbio/bigslice
[33]使用 Go 重振 Linux 编程课程: http://www.ccsc.org/publications/journals/MW2019.pdf#page=61
[34]GopherCon UK 2019 视频合集: https://www.bilibili.com/video/av70127356
[35]Go 云开发工具包: https://gocloud.dev/
[36]在 Go 上精选的博客文章: https://github.com/enocom/gopher-reading-list
[37]Go语言中文网: https://studygolang.com/go/weekly
[38]微信公众号: https://weixin.sogou.com/weixin?query=Go%E8%AF%AD%E8%A8%80%E4%B8%AD%E6%96%87%E7%BD%91
[39]今日头条: https://www.toutiao.com/c/user/59903081459/#mid=1586087918877709