摘要: 今天我在看 Prashant Varanasi 的 Go 发布会演讲:使用火焰图进行生产分析(Analyzing production using Flamegraphs),在演讲开始的第 28 分钟他提到了一种涉及切片的有趣且棘手的内存泄漏。为了自我提升,我将在这里写一下该内存泄漏的一种形式,并说 阅读全文
posted @ 2020-08-21 09:33 polarisxu 阅读(376) 评论(0) 推荐(0) 编辑
摘要: 文讨论 Go 编译器是如何实现内联的以及这种优化方法如何影响你的 Go 代码。 *请注意:*本文重点讨论 gc,实际上是 golang.org 的 Go 编译器。讨论到的概念可以广泛用于其他 Go 编译器,如 gccgo 和 llgo,但它们在实现方式和功能上可能有所差异。 内联是什么? 内联就是把 阅读全文
posted @ 2020-08-20 08:59 polarisxu 阅读(973) 评论(0) 推荐(0) 编辑
摘要: 十年前,谷歌正在面临一个由 C++ 编译时间过长所造成的严重瓶颈,并且需要一个全新的方式来解决这个问题。谷歌的工程师们通过创造了一种新的被称作 Go (又名 Golang)的语言来应对挑战。这个新语言 Go 带来了 C++ 最好的部分(最主要的是它的性能和稳定性),又与 Python 的速度相结合, 阅读全文
posted @ 2020-08-19 08:58 polarisxu 阅读(407) 评论(0) 推荐(0) 编辑
摘要: 这是探讨 Go 编译器两篇文章的最后一篇。在第 1 部分中,我们通过构建自定义的编译器,向 Go 语言添加了一条新语句。为此,我们按照此图介绍了编译器的前五个阶段: 在"rewrite AST"阶段前,我们实现了 until 到 for 的转换;具体来说,在gc/walk.go文件中,在编译器进行 阅读全文
posted @ 2020-08-18 08:55 polarisxu 阅读(297) 评论(0) 推荐(0) 编辑
摘要: 强调一下是我个人的见解以及接口在 Go 语言中的意义。 如果您写代码已经有了一段时间,我可能不需要过多解释接口所带来的好处,但是在深入探讨 Go 语言中的接口前,我想花一两分钟先来简单介绍一下接口。 如果您对接口很熟悉,请先跳过下面这段。 接口的简单介绍 在任一编程语言中,接口——方法或行为的集合, 阅读全文
posted @ 2020-08-15 09:34 polarisxu 阅读(886) 评论(0) 推荐(1) 编辑
摘要: JSON payload 实现简易的请求和响应的内省。 介绍 大家经常说 gRPC 是基于 Google Protocol Buffers payload 格式的,然而这不完全正确。gRPC payload 的默认格式是 Protobuf,但是 gRPC-Go 的实现中也对外暴露了 Codec in 阅读全文
posted @ 2020-08-13 21:11 polarisxu 阅读(2172) 评论(0) 推荐(0) 编辑
摘要: 出于很多目的,我从最新的 Go 系统内核开发源码复制了一份代码,在一个正常的运行环境中构建(和重新构建)它,在构建版本基础上周期性地重新构建 Go 程序。近期我在用 ps 查看我的一个程序的内存使用情况时,发现它占用了约 138 GB 的巨大虚拟空间(Linux ps 命令结果的 VSZ 字段),尽 阅读全文
posted @ 2020-08-11 19:42 polarisxu 阅读(560) 评论(0) 推荐(0) 编辑
摘要: 今天,我遇到了一个 Go FAQ。首先,作为一个小小的 Go 语言测验,看看您是否在 Go playground 中运行该程序之前就能推断出它应该打印出的内容(我已经将程序放在侧边栏中,以防它在 Go playground 上消失)。该程序的关键代码是: type fake struct { io. 阅读全文
posted @ 2020-08-10 18:57 polarisxu 阅读(267) 评论(0) 推荐(0) 编辑
摘要: 假设(并非完全假设,这里有 demo)你正在编写一个程序包,用于连接 Go 和其它一些提供大量 C 结构体内存的程序。这些结构可能是系统调用的结果,也可能是一个库给你提供的纯粹信息性内容。无论哪种情况,你都希望将这些结构传递给你的程序包的用户,以便他们可以使用这些结构执行操作。在你的包中,你可以直接 阅读全文
posted @ 2020-08-09 13:41 polarisxu 阅读(1570) 评论(0) 推荐(0) 编辑
摘要: 这是一个 API 设计的思想实验,它从典型的 Go 单元测试惯用形式开始: func TestOpenFile(t *testing.T) { f, err := os.Open("notfound") if err != nil { t.Fatal(err) } // ... } 这段代码有什么问 阅读全文
posted @ 2020-08-08 19:38 polarisxu 阅读(333) 评论(0) 推荐(0) 编辑