惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
C
Check Point Blog
博客园 - Franky
月光博客
月光博客
T
Tenable Blog
博客园 - 聂微东
Cyberwarzone
Cyberwarzone
The GitHub Blog
The GitHub Blog
C
CERT Recently Published Vulnerability Notes
Scott Helme
Scott Helme
IT之家
IT之家
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
CXSECURITY Database RSS Feed - CXSecurity.com
F
Full Disclosure
博客园 - 司徒正美
Project Zero
Project Zero
Y
Y Combinator Blog
A
Arctic Wolf
美团技术团队
博客园 - 叶小钗
S
Securelist
F
Fortinet All Blogs
T
Threatpost
T
Threat Research - Cisco Blogs
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
酷 壳 – CoolShell
酷 壳 – CoolShell
MyScale Blog
MyScale Blog
大猫的无限游戏
大猫的无限游戏
Recorded Future
Recorded Future
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Schneier on Security
Apple Machine Learning Research
Apple Machine Learning Research
L
LangChain Blog
P
Privacy International News Feed
博客园_首页
S
SegmentFault 最新的问题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
P
Proofpoint News Feed
Cisco Talos Blog
Cisco Talos Blog
AWS News Blog
AWS News Blog
阮一峰的网络日志
阮一峰的网络日志
G
Google Developers Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
雷峰网
雷峰网
P
Proofpoint News Feed
Latest news
Latest news
G
GRAHAM CLULEY

文章列表 on polarisxu

通过一个例子让你彻底掌握 Go 工作区模式 这道题正确率竟然只有 22% Go 开源项目推荐:一个简单的 Go 练手项目 go test 如何禁用缓存? Go1.18 快讯:constraints 包被移除标准库 跟着 Go 作者学泛型 「2022 版」轻松搞定 Go 开发环境 鹅厂小哥用行动反对加班:程序员加班能被终结吗? Go 为什么选择 Gopher 作为吉祥物? 本地如何配置多个 GitHub/Gitee 账号? 为 Java 开发者准备的 Go 教程 02:Java 有而 Go 无 GitHub 发现了 studygolang 项目依赖的漏洞 Typora 宣布收费后,这款开源 Markdown 编辑器火了 为 Java 开发者准备的 Go 教程 01:漫游了 我的 2021 年终总结 泛型版 singleflight:Go 中如何防止缓存击穿? 2021 年你写了多少代码?这个 Go 工具帮你统计 Go1.18 新特性:TryLock Go 泛型入门教程 程序员瑞士军刀:各种结构的转换工具 终于有 Go 版的 Elasticsearch 了 Go泛型系列:maps 包讲解 Go 1.18 中的 any 是什么? Go1.18 快讯:新的 IP 包 Go编程模式:详解函数式选项模式 Go泛型系列:slices 包讲解 Nginx 竟然也有 playground — Go 语言构建的 Go泛型系列:Go1.18 类型约束那些事 Go1.18 快讯:Module 工作区模式 Go1.18 快讯:新增的 Cut 函数太方便了 Go1.18 快讯:废弃了这个 API Go1.18 快讯:新增字符串 Clone API Go:如何获得项目根目录? Go 如何获取和设置环境变量 重磅变动:更快找到微信公众号里的Go文章 Go 这样设置版本号:我们的项目也可以 假期结束,推荐 2 本 manning 出的 Go 图书 Go Fiber 框架系列教程 04:测试应用 Go Fiber 框架系列教程 03:中间件 Go泛型系列:提前掌握Go泛型的基本使用 推荐一个 Go GUI 实战项目 Go Fiber 框架系列教程 02:详解相关 API 的使用 Go Fiber 框架系列教程 01: 和 Express 对比学习 Go Module:私有不合规库怎么解决引用问题 Go1.17 新特性:go get 变了 Go1.17 新特性:testing 包的相关变化 StackOverflow 上关于 Go select 死锁的问题 新书推荐:用 Gin 框架构建分布式应用 Go 官网要变天。。。 Gin 这是要成为 Go 官方框架? 扬眉吐气:刚刚,Go 已经默认支持泛型了 Go 1.17 新特性:Module 有哪些变化? Go 第三方库推荐:类型转换如此简单 担心密码提交到 GitHub?建议使用这个 Go 开源工具 Go 的时间格式化为什么是 2006-01-02 15:04:05? GitHub 为 Go 社区带来安全支持 Go开源项目推荐:500行代码确认请求时间花在哪 一道关于 len 函数的诡异 Go 面试题解析 厉害了我的 Go:推荐系统都有开源实现 Go1.17 新特性:新版构建约束 这个工具真好:看看你的Go项目依赖有无漏洞 网友很强大,发现了Go并发下载的Bug Rust 劝退系列 09:函数 Go项目实战:一步步构建一个并发文件下载器 这本 Go 新书挺期待的:100 个常见错误 Go 启用新的官方问答社区 这是要干嘛?!微软招 Go 编译器全职开发人员 Go1.17 快报之标准库越来越注重易用性 Go1.17 新特性之切片变数组 回顾 Go 官网的演变史 站长8年前的Go代码竟然进入大厂的项目里了 Go图书翻译:一个好消息,一个坏消息 不怕烂尾!决定组织翻译这本 Go 图书 Rust 劝退系列 08:模式匹配 一本花了2.5年写成的Go免费在线图书 被黑惨了:一句话,说明自己会 Go,咋整? Go1.16 中的新函数 signal.NotifyContext 怎么用? Go 1.17 新特性提前学之测试执行随机化 Rust 劝退系列 07:流程控制 官方的 Go 多版本管理:使用和原理 Rust新书:给你一个劝退的理由 周刊题解:常量表达式这个规则应该了解下 盘点那些使用 Go 语言的国外公司 Rust 劝退系列 06:常量 Uber 使用 Go 的规模这么大?!都自己定制的 Go 编译器了 Go Team Leader — rsc 大神新开源了一个库,增强模板功能 再一次看到了 Go 的节制:int128 类型要不要支持? Rust 劝退系列 05:复合数据类型 「卷」有理论依据:海勒姆定律—Go又是怎么卷的 Go 真的也可以进行 GUI 开发:还有这样的图书呢 Rust 劝退系列 04:基本数据类型 我的 Go 语言书单 Rust 劝退系列 03:变量 我又来推荐免费 Go 新书了:一本用 Go 讲架构的书 注释竟然还有特殊用途?一文解惑 //go:linkname 指令 这个功能,公众号、微信群会不会被玩坏? 一道 Go 闭包题,面试官说原来自己答错了:面别人也涨知识 Rust 劝退系列 02:第一个 Rust 程序 Rust 劝退系列 01:打造开发环境 答应我,这次一定彻底搞懂 Go 中的类型别名
编写了50万行Go代码是一种什么体验
2021-05-17 · via 文章列表 on polarisxu

大家好,我是 polarisxu。

今天看到一篇文章,分享给大家,看看写了 50 万行代码的 Gopher 对 Go 有什么感想。

先简单介绍下可汗学院(Khan Academy)。

这是一个非营利性组织,其使命是在任何地方为任何人提供免费的、世界级的教育。

全球有 6.17 亿儿童缺乏基本的数学和阅读技能。可汗学院是一个提供他们所需教育的非营利组织,因此需要大家的帮助,你的帮忙可以改变一个孩子的一生。

所以,从网站介绍可以看出,这个组织主要靠大家的赞助维持运营。如果你支持这样的公益事业,可以到官网:https://www.khanacademy.org/ 赞助。

从 Python2 迁移到 Go

可汗学院的项目 Goliath,最开始使用 Python2 实现的,2019 年逐步将其迁移到了 Go。这里有一篇文章介绍了迁移的事情:https://blog.khanacademy.org/go-services-one-goliath-project/

因为这个决定,现在可汗学院所有的后端和全栈工程师都开始写 Go 代码,经过几年的积累,该项目跨域了一个巨大的里程碑:有超过 50 万行 Go 代码在线上运行着。这对于 Go 整个社区来说也是一件好事。

可汗学院的工程师们普遍认为「Go 很容易写和读」,用 Go 越多就越喜欢它。

一个有多年 .NET 经验的工程师说,Go 的错误处理和 .NET 的异常处理很不一样。虽然经常要处理 error,但如果一个函数没有返回错误,那可以确定它一定成功了,这一点还是很棒的。

此外,他们对 Go 的工具链很喜欢。比如通过 go doc 可以查找标准库的文档,特别方便。gofmt 让代码格式都一直,很适合阅读代码。虽然 Go Module 在社区抱怨的声音不少,但相比之前来说,还是有很大进步,而且可汗学院在使用过程中没有什么特别差的体验。

同时,他们很喜欢 Go 的编译速度,那叫一个快!

泛型,还是需要的

虽然大部分时候,并不需要泛型。但有时候,特别是是在写内部库时,尤其涉及到 slice 时,明显得感觉到需要泛型。

没有泛型是目前社区对 Go 抱怨最多的(虽然也有人说不需要泛型,有泛型了就不用 Go 了。。。),目前 Go 团队花了大量的时间在推进泛型。目前已经可以尝鲜,预计泛型会在 1.18 正式发布。

他们在迁移 Python 代码时,有些 Python 的语言结构,使用 Go 实现需要花费较多时间。不过,Go 的语言特性少,使得代码更一致,可读性更好。就他们的系统,有些特性,需要 2.7 倍的 Go 代码实现同样功能的 Python 代码。注意,是部分功能。

习惯了 Python 的人,他们希望 Go 中能够有更多的高阶函数。随着泛型的加入,这方面可能会加强,比如计划增加的 slices 包。

性能和并发性

相比 Python,发现 Go 的性能非常优秀。尽管迁移过程中,有点直接从 Python 翻译到 Go 的感觉,没有对 Go 代码做专门优化,但性能表现依然抢眼。优化后会有更好的表现。

其中一名工程师发现,Python 版本中,某些批量数据更改每小时会产生大约 100 个 Google Cloud Datastore 竞争警告,而在 Go 版本中,竞争警告接近于零,因为它处理数据的速度要快得多。他们有一个包含 1000 名学生的课程,在 Python 中加载需要 28 秒,而在 Go 中只需要 4 秒。

虽然他们的 Python 版本时候单线程的,但 Go 版本还是使用了并发的特性。

Go 官方一般推荐使用 Goroutiine + Channel,但可汗学院发现,他们使用 sync 包的数量远超 channel,不知道这种情况将来会不会改变。

50 万行代码后的总结

  • 一般来说,实现同样的功能,Go 代码会比 Python 多;
  • 但 Go 的速度快,工具好用,而且在线上运行稳定、良好;

虽然可汗学院的工程师有不同的背景,对 Go 和其他语言也有不同的看法。经过这段时间的磨合,目前看,对 Go 他们还算满意。


你写了多少 Go 代码?你对 Go 的感受是什么?