|
| 1 | +# Go语言爱好者周刊:第 7 期 |
| 2 | + |
| 3 | +这里记录每周值得分享的 Go 语言相关内容,周日发布。 |
| 4 | + |
| 5 | +欢迎投稿,推荐或自荐文章/软件/资源等,请[提交 issue](https://github.com/polaris1119/golangweekly/issues) 。 |
| 6 | + |
| 7 | +鉴于大部分人可能没法坚持把英文文章看完,因此,周刊中会尽可能推荐优质的中文文章。优秀的英文文章,我们的 GCTT 组织会进行翻译。 |
| 8 | + |
| 9 | + |
| 10 | + |
| 11 | +(题图:来源 Twitter) |
| 12 | + |
| 13 | +## 刊首语 |
| 14 | + |
| 15 | +Go1.13 正式发布,圈内发布了相关的文章,本期周刊无疑这方面是重点。 |
| 16 | + |
| 17 | +就 Go1.13 版本对普通用户而言,有两点需要着重关注:Module 相关的改动和 errors 包新增的函数。 |
| 18 | + |
| 19 | +对于 Go1.13 的 Module,我们可以通过 GOPROXY 来控制代理,以及通过 GOPRIVATE 控制私有库不走代理。 |
| 20 | + |
| 21 | +设置 GOPROXY 代理: |
| 22 | + |
| 23 | +> go env -w GOPROXY=https://goproxy.cn,direct |
| 24 | +
|
| 25 | +设置 GOPRIVATE 来跳过私有库,比如常用的 Gitlab 或 Gitee 或 Gitea,中间使用逗号分隔: |
| 26 | + |
| 27 | +> go env -w GOPRIVATE=*.gitlab.com,*.gitee.com,*.gitea.com |
| 28 | +
|
| 29 | +如果在运行 go mod vendor 时,提示 `Get https://sum.golang.org/lookup/xxxxxx: dial tcp 216.58.200.49:443: i/o timeout`,则是因为 Go 1.13 设置了默认的 GOSUMDB=sum.golang.org,这个网站是被墙了的,用于验证包的有效性,可以通过如下命令关闭: |
| 30 | + |
| 31 | +> go env -w GOSUMDB=off |
| 32 | +
|
| 33 | +## 资讯 |
| 34 | + |
| 35 | +1、[Go 1.13 正式发布,看看都有哪些值得关注的特性](https://mp.weixin.qq.com/s/7Q2vvFF88NXI3CgEFYY4mg) |
| 36 | + |
| 37 | +核心点主要有:Module 完善、数字字面量、错误包装、默认启用 TLS1.3、逃逸分析优化、defer 性能提升、sync.Pool 优化等。[该 PPT 是另外一种获取新特性的渠道](https://docs.google.com/presentation/d/1RiZmupILuIQQ1Y-psDb1SzXNjCWh-I_-wagthdcwlq8/edit#slide=id.g604d13147b_0_113)(英文)。 |
| 38 | + |
| 39 | +2、[Grafana 6.3.5 发布,系统指标监控与分析平台](https://www.oschina.net/news/109546/grafana-6-3-5-released) |
| 40 | + |
| 41 | +Grafana 是一个功能丰富的指标标准仪表板和图形编辑器,用于分析和监控 Graphite、Elasticsearch、OpenTSDB、Prometheus 和 InfluxDB。 |
| 42 | + |
| 43 | + |
| 44 | + |
| 45 | +3、[NSQ 1.2.0 发布,实时分布式消息传递平台](https://www.oschina.net/news/109523/tnsq-1-2-0-released) |
| 46 | + |
| 47 | +NSQ 是无中心设计、节点自动注册和发现的开源消息系统。可作为内部通讯框架的基础,易于配置和发布。 |
| 48 | + |
| 49 | +4、[分布式图数据库 Dgraph 发布 1.1 版本](https://github.com/dgraph-io/dgraph/releases/tag/v1.1.0) |
| 50 | + |
| 51 | +Dgraph 是一个水平可扩展的分布式图形数据库,提供 ACID 事务,一致的复制和线性化读取。它是从头开始构建的,用于执行丰富的查询。作为本机图形数据库,它严格控制数据在磁盘上的排列方式,以优化查询性能和吞吐量,减少群集中的磁盘搜索和网络调用。 |
| 52 | + |
| 53 | +5、[CoreDNS 1.6.3 发布,Go 语言实现的 DNS 服务器](https://github.com/coredns/coredns/releases/tag/v1.6.3) |
| 54 | + |
| 55 | +CoreDNS 是一个 DNS 服务器/转发器,用 Go 编写,链式插件。 每个插件都执行(DNS)功能。 |
| 56 | + |
| 57 | +6、[protobuf 1.3 发布,从golang/protobuf fork 的版本](https://github.com/gogo/protobuf) |
| 58 | + |
| 59 | +比 golang/protobuf 增加更多代码生成特性: |
| 60 | + |
| 61 | +- 快速 marshalling 和 unmarshalling |
| 62 | +- 更规范的 Go 结构 |
| 63 | +- goprotobuf 兼容性 |
| 64 | +- 通过可选地生成额外的帮助代码来减少输入 |
| 65 | +- 通过选择性地生成测试和基准代码增强信心 |
| 66 | +- 其他序列化格式 |
| 67 | + |
| 68 | +7、[REST Layer 0.2 发布,一个 REST 风格 API 框架](https://github.com/rs/rest-layer) |
| 69 | + |
| 70 | +REST Layer 是一个受到优秀 Python Eve 启发的 API 框架。它可以帮助您在可插拔的后端存储上创建一个全面的,可自定义的,安全的 REST(graph)API,没有样板代码,因此您可以专注于您的业务逻辑。 |
| 71 | + |
| 72 | +## 问答 |
| 73 | + |
| 74 | +1、[golang map类型变量保存的是实际值所在的地址还是什么](https://segmentfault.com/q/1010000020045637) |
| 75 | + |
| 76 | +初始化了一个map型的变量m,使用printf(%p)的格式分别对m和&m进行输出,分别得到两个地址。&m显而易见是m变量的地址,令我困惑的是m也可以输出一个地址,但有人说m保存的并非指针,那为什么m却可以输出地址?map类型的变量访问的机制是什么样的? |
| 77 | + |
| 78 | +2、[Golang中,runtime.Caller(skip),为什么会保留编译器变量?](https://segmentfault.com/q/1010000020145507) |
| 79 | + |
| 80 | +在其他目录下执行非当前目录下的go文件,要求输出go文件的所在绝对路径,我才用的方法是runtime.Caller(0),获取文件位置,但是发现,如果我在A目录下编译的go文件,mv到B目录下之后,go文件依旧输出A的目录。要实现这个需求要怎么做? |
| 81 | + |
| 82 | +3、[疑惑 return 后面的 defer 到底会不会执行?](https://studygolang.com/topics/9967) |
| 83 | + |
| 84 | +新手莫非有此疑惑? |
| 85 | + |
| 86 | +4、[Go 语言中, 空的死循环与永远阻塞的 chan 细节上有什么差异?](https://www.zhihu.com/question/39766078/answer/748425459) |
| 87 | + |
| 88 | +```go |
| 89 | +func main() { for {} } |
| 90 | +``` |
| 91 | + |
| 92 | +与 |
| 93 | + |
| 94 | +```go |
| 95 | +func main() { <-make(chan struct{}) } |
| 96 | +``` |
| 97 | + |
| 98 | +来阻止 main 函数退出。 |
| 99 | + |
| 100 | +5、[如何阅读 Golang 的源码?](https://www.zhihu.com/question/327615791/answer/756625130) |
| 101 | + |
| 102 | +学习go语言的过程中,觉得源码写的很棒,但是有点晦涩,该怎么阅读? |
| 103 | + |
| 104 | +6、[golang interface 作用疑惑](https://segmentfault.com/q/1010000020302054) |
| 105 | + |
| 106 | +关于接口有些疑惑。好像用方法可以实现的逻辑,为啥非要用接口呢? 接口反而麻烦,多写几行代码了。 |
| 107 | + |
| 108 | +7、[Go 语言 fmt.Scanf 方法的问题](https://segmentfault.com/q/1010000020296537) |
| 109 | + |
| 110 | +```go |
| 111 | +func main() { |
| 112 | + var a, b, c int |
| 113 | + for i := 0; i < 2; i++ { |
| 114 | + fmt.Scanf("%d,%d,%d", &a, &b, &c) |
| 115 | + fmt.Println(a, b, c) |
| 116 | + } |
| 117 | +} |
| 118 | +``` |
| 119 | + |
| 120 | +这段代码,我只输入一次,为什么会有两次输出结果? |
| 121 | +输入:1,2,3 |
| 122 | +输出结果为: |
| 123 | +1 2 3 |
| 124 | +1 2 3 |
| 125 | + |
| 126 | +8、[golang 框架 Gin 中间件的 c.Next() 有什么作用?](https://segmentfault.com/q/1010000020256918) |
| 127 | + |
| 128 | +感觉用不用效果一样的啊,看文档说是执行挂起程序,具体怎么好理解一些呢,每个中间件一定要用吗? |
| 129 | + |
| 130 | +## 文章 |
| 131 | + |
| 132 | +1、[Go语言(golang)新发布的1.13中的 Error Wrapping 深度分析](https://www.flysnow.org/2019/09/06/go1.13-error-wrapping.html) |
| 133 | + |
| 134 | +Go 1.13发布的功能有一个值得深入研究的,就是对 Error 的增强,也是今天我们要分析的 Error Wrapping。 |
| 135 | + |
| 136 | +2、[Go1.13 defer 的性能是如何提高的?](https://mp.weixin.qq.com/s/lwBLVjdZCkwTEZzXhpwKJg) |
| 137 | + |
| 138 | +最近 Go1.13 终于发布了,其中一个值得关注的特性就是 **defer 在大部分的场景下性能提升了30%**,但是官方并没有具体写是怎么提升的,这让大家非常的疑惑。而我因为之前写过[《深入理解 Go defer》](https://studygolang.com/articles/21224) 和 [《Go defer 会有性能损耗,尽量不要用?》](https://studygolang.com/articles/21233) 这类文章,因此我挺感兴趣它是做了什么改变才能得到这样子的结果,所以今天和大家一起探索其中奥妙。 |
| 139 | + |
| 140 | +3、[goproxy.cn - 为中国 Go 语言开发者量身打造的模块代理](https://studygolang.com/topics/10014) |
| 141 | + |
| 142 | +[goproxy.cn](https://goproxy.cn/) 还是是一个非营利性项目,目标是为中国和世界上其他地方的 Gopher 们提供一个免费的、可靠的、持续在线的且经过 CDN 加速的模块代理。另附一篇简短的设置 Go proxy 的文章:[Go 1.13设置代理](https://studygolang.com/articles/23326)。 |
| 143 | + |
| 144 | +4、[有 GC 的编程语言就一劳永逸了吗?GODEBUG来助力 Gopher 调试 GC](https://mp.weixin.qq.com/s/V4Lwlc0KWfGfWZPYL26hZA) |
| 145 | + |
| 146 | +通过本文我们可以掌握使用 GODEBUG 查看应用程序 GC 运行情况的方法,只要用这种方法我们就可以观测不同情况下 GC 的情况了,甚至可以做出非常直观的对比图,大家不妨尝试一下。 |
| 147 | + |
| 148 | +5、[GCTT出品 | Go 中的 gRPC 简介](https://mp.weixin.qq.com/s/KRzfUqP_4kd7Uo-xAw29NA) |
| 149 | + |
| 150 | +给使用 Go 语言的初学者的 gRPC 概述 |
| 151 | + |
| 152 | +6、[GCTT 出品 | Go 中的缓存现状](https://mp.weixin.qq.com/s/yTUj5iTJ_yH8YeQD1qoVUQ) |
| 153 | + |
| 154 | +这篇文章登上了 Golang 在 Reddit subreddit 板块的顶部,并在 Hacker News 首页排名到第二名。欢迎各位来阅读讨论,并在 Github 上面给我们一个小星星。 |
| 155 | + |
| 156 | +7、[Go 语言回顾:从Go 1.0到Go 1.13](https://tonybai.com/2019/09/07/go-retrospective/) |
| 157 | + |
| 158 | +[Go 1.13版本](https://tip.golang.org/doc/go1.13)在2019.9.3[正式发布](https://blog.golang.org/go1.13)!国外的Gopher Vincent Blanchon发表了一篇文章[《Go: Retrospective》](https://medium.com/a-journey-with-go/go-retrospective-b9723352e9b0)(科学上网阅读),对Go从1.0版本到1.13版本做了简要的回顾,这里是那篇文章的译文。 |
| 159 | + |
| 160 | + |
| 161 | + |
| 162 | +8、[深度解密Go语言之scheduler](https://qcrao.com/2019/09/02/dive-into-go-scheduler/) |
| 163 | + |
| 164 | +来自码农桃花源的作者:饶全成 深度揭秘系列。探索 Go 语言中的调度器。 |
| 165 | + |
| 166 | + |
| 167 | + |
| 168 | +9、[一道经常考的面试题](https://studygolang.com/articles/23333) |
| 169 | + |
| 170 | +关于循环创建 goroutine 输出的问题。 |
| 171 | + |
| 172 | +10、[Go 笔记之如何测试你的 Go 代码](https://juejin.im/post/5d6d462ef265da03e5234f57) |
| 173 | + |
| 174 | +不论是开源项目,还是日常程序的开发,测试都是必不可少的一个环节。今天我们开始进入 Go 测试模块 testing 的介绍。 |
| 175 | + |
| 176 | +## 开源项目 |
| 177 | + |
| 178 | +1、[bild:纯 Go 实现的并行图像处理算法集合](https://github.com/anthonynsimon/bild) |
| 179 | + |
| 180 | +一个图像处理的命令行工具,Go 语言编写。可以通过命令行参数,调节亮度、饱和度、模糊、锐化等。活脱脱一个命令行的傻瓜 PS 工具。 |
| 181 | + |
| 182 | +```bash |
| 183 | +bild |
| 184 | + |
| 185 | +A collection of parallel image processing algorithms in pure Go |
| 186 | + |
| 187 | +Usage: |
| 188 | + bild [command] |
| 189 | + |
| 190 | +Available Commands: |
| 191 | + adjust adjust basic image features like brightness or contrast |
| 192 | + blend blend two images together |
| 193 | + blur blur an image using the specified method |
| 194 | + channel channel operations on images |
| 195 | + effect apply effects on images |
| 196 | + help Help about any command |
| 197 | + histogram histogram operations on images |
| 198 | + imgio i/o operations on images |
| 199 | + noise noise generators |
| 200 | + segment segment an image using the specified method |
| 201 | + |
| 202 | +Flags: |
| 203 | + -h, --help help for bild |
| 204 | + --version version for bild |
| 205 | + |
| 206 | +Use "bild [command] --help" for more information about a command. |
| 207 | +``` |
| 208 | + |
| 209 | +2、[lefthook:快速而强大的 Git 钩子管理器,适用于任何类型的项目](https://github.com/Arkweid/lefthook) |
| 210 | + |
| 211 | +Git 钩子管理器,可以用在各种项目之中。特点是功能强大,允许并行执行多个任务。 |
| 212 | + |
| 213 | +3、[cache2go:具有过期功能和访问计数器的并发安全 Go 缓存库](https://github.com/muesli/cache2go) |
| 214 | + |
| 215 | +可以当作本地缓存库使用。 |
| 216 | + |
| 217 | +4、[Litter:一个用于调试的辅助工具,可以漂亮的打印出 Go 数据结构](https://github.com/sanity-io/litter) |
| 218 | + |
| 219 | +比如下面的代码: |
| 220 | + |
| 221 | +```go |
| 222 | +type Person struct { |
| 223 | + Name string |
| 224 | + Age int |
| 225 | + Parent *Person |
| 226 | +} |
| 227 | + |
| 228 | +litter.Dump(Person{ |
| 229 | + Name: "Bob", |
| 230 | + Age: 20, |
| 231 | + Parent: &Person{ |
| 232 | + Name: "Jane", |
| 233 | + Age: 50, |
| 234 | + }, |
| 235 | +}) |
| 236 | +``` |
| 237 | + |
| 238 | +输出是: |
| 239 | + |
| 240 | +``` |
| 241 | +Person{ |
| 242 | + Name: "Bob", |
| 243 | + Age: 20, |
| 244 | + Parent: &Person{ |
| 245 | + Name: "Jane", |
| 246 | + Age: 50, |
| 247 | + }, |
| 248 | +} |
| 249 | +``` |
| 250 | + |
| 251 | +是不是比通常的输出好看多了呢? |
| 252 | + |
| 253 | +5、[xxhash:64位 XxHash 算法的实现,XXH64](https://github.com/cespare/xxhash) |
| 254 | + |
| 255 | +一种高质量的哈希算法,比 Go 标准库中的任何算法都要快得多。 |
| 256 | + |
| 257 | +6、[dbx:一个支持 KV 缓存全表数据的高性能 golang db 库](https://github.com/mydeeplike/dbx) |
| 258 | + |
| 259 | +一个支持对全表数据进行透明缓存的 Golang DB 库,在内存足够大的情况下,不再需要 Memcached, Redis 等缓存服务。 而且读取缓存的速度相当之快,本机测试 qps 达到: 350万+/秒,可以有效的简化应用端业务逻辑代码。 它支持 MySQL/Sqlite3,支持结构体自由组合嵌套。 它的实现原理为自动扫描表结构,确定主键和自增列,并且通过主键按照行来缓存数据,按照行透明管理 cache,上层只需要按照普通的 ORM 风格 API 操作即可。 |
| 260 | + |
| 261 | +7、[joe:一个通用的机器人库,受 Hubot 的启发,但是用 Go 编写](https://github.com/go-joe/joe) |
| 262 | + |
| 263 | +Joe是一个用于在 Go 编程语言中编写聊天机器人的库。它 Hubot 框架的启发,并为想要使用 Go 实现聊天机器人的人们带来了它的便利。 |
| 264 | + |
| 265 | +8、[elton:高性能、简单的、类 koa 的Web 框架](https://github.com/vicanso/elton) |
| 266 | + |
| 267 | +开始接触后端开发是从 nodejs 开始,最开始使用的框架是 express,后来陆续接触了其它的框架,觉得最熟悉的还是koa。使用 golang 做后端开发时,对比使用过 gin,echo 以及 iris 三个框架,它们的用法都类似(都支持中间件,中间件的处理也类似),但是在开发过程中还是钟情于 koa 的处理方式,失败则 throw error,成功则将响应数据赋值至 ctx.body,简单易懂。于是造了这个轮子。 |
| 268 | + |
| 269 | +9、[bokchoy:基于 Redis 的 Go 简单队列](https://github.com/thoas/bokchoy) |
| 270 | + |
| 271 | +Bokchoy是一个简单的 Go 库,用于排队任务并在后台与工作人员一起处理它们。它应该很容易集成到您的 Web 堆栈中,并且它的设计目标是为新手提供较低的屏障。 |
| 272 | + |
| 273 | +## 资源&&工具 |
| 274 | + |
| 275 | +1、[TeaWeb:可视化的 Web 代理服务](https://github.com/TeaWeb/build) |
| 276 | + |
| 277 | +集静态资源、缓存、代理、统计、日志、安全、监控于一体的可视化智能 WebServer。使用Go语言实现,在高可定制化前提下,保证高性能、高并发。 |
| 278 | + |
| 279 | +2、[curlie:用于 HTTP 请求的 CLI 工具](https://github.com/rs/curlie) |
| 280 | + |
| 281 | +如果您喜欢 HTTPie 的界面但却错过了 curl 的功能,那么 curlie 就是您想要的工具。 Curlie 是 curl 的前端,增加了httpie的易用性,而不会影响功能和性能。 |
| 282 | + |
| 283 | +3、[bed:用 Go 编写的二进制/十六进制编辑器](https://github.com/itchyny/bed) |
| 284 | + |
| 285 | + |
| 286 | + |
| 287 | +4、[阿里云大学开发者课堂](https://edu.aliyun.com/developer) |
| 288 | + |
| 289 | +数据时代的IT技能学习平台,云计算、大数据、人工智能等前沿及基础技术课程学、练、测、在线实验一站式体验。包含各种视频教程。大部分都是免费的。 |
| 290 | + |
| 291 | +5、[帮助你下次技术面试的资料汇总](https://github.com/yangshun/tech-interview-handbook) |
| 292 | + |
| 293 | +精心策划的内容可帮助您完成下一次技术面试,重点关注算法。 |
| 294 | + |
| 295 | +6、[轻进存销管理系统](https://github.com/Allenxuxu/mogutouERP) |
| 296 | + |
| 297 | +mogutouERP 是一个前后端分离的微型进存销系统,采用 Gin + Vue 开发。如果你觉得没有项目练手,可以看看别人怎么开发一个项目的。 |
| 298 | + |
| 299 | +7、[Gin Weibo App](https://github.com/Away0x/gin_weibo) |
| 300 | + |
| 301 | +练习项目,使用 Gin 框架实现简单的微博功能。 |
| 302 | + |
| 303 | +8、[YourNovel-基于Golang的开源小说搜索引擎&免费小说阅读网站](https://github.com/DemonFengYuXiang/YourNovel) |
| 304 | + |
| 305 | +这里小说不是我要推荐的关键,还是这个项目本身,学习使用 Go 语言搭建一个网站,爬取相关的数据的技术。 |
| 306 | + |
| 307 | +## 订阅 |
| 308 | + |
| 309 | +这个周刊每周日发布,同步更新在[Go语言中文网](https://studygolang.com/go/weekly)、[微信公众号](https://weixin.sogou.com/weixin?query=Go%E8%AF%AD%E8%A8%80%E4%B8%AD%E6%96%87%E7%BD%91) 和 [今日头条](https://www.toutiao.com/c/user/59903081459/#mid=1586087918877709)。 |
| 310 | + |
| 311 | +微信搜索"Go语言中文网"或者扫描二维码,即可订阅。 |
| 312 | + |
| 313 | + |
0 commit comments