GCTT - Go 中文翻译组

收录了 473 篇文章 · 335 人关注

  • Go 高级基准测试

    ## 背景 有时你必须解决不同类型的问题。通常来说复杂的问题并不会只有单一的解决方案,但是解决方案的优劣取决于程序在运行时所要解决问题的子集。 我所遇到的一个例子是分析一些代理的连接中的某些数据流。 从流量中提取信息的方法主要有两种:保存整个数据流,当流量结束后立即分析;或者(使用一个缓存窗口)以降低速度为代价,在数据流传输过程中进行分析。 内存相对与处理能力来说要更加便宜,所以我的第一版解决方案是使用缓存的方案。 ### 第一版代码:使用缓存(buffer) ...

  • 120
    Go:异步抢占

    ![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20200501-Go-Asynchronous-Preemption/00.png) ℹ️ 本文基于 Go 1.14。 抢占是调度器的重要部...

  • 120
    Go 中使用别名,简单且高效

    ![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images2/master/Go-Aliases-Simple-and-Efficient/00.png) ℹ️ 本文基于 Go 1.13。 Go 1.9 版本引入了别...

  • 120
    用 Golang 实现 RSA 加密和签名(有示例)

    本文介绍 RSA 干了什么,以及我们怎样用 Go 实现它。 ![](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20200408-Implementing-RSA-Encryption-and-Signing-in-Golang/00.jpg) RSA(*Rivest–Shamir–Adleman*)加密是使用最广的安全数据加密算法之一。 它是一种非对称加密算法,也叫”单向加密“。用这种方式...

  • 120
    Go 协程的开启和退出

    ![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20200401-Go-How-Does-a-Goroutine-Start-and-Exit/00.png) ℹ️本文基于 Go 1.14。 ...

  • 120
    Go:边界检查确保内存安全

    ![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20200304-Go-Memory-Safety-with-Bounds-Check/cover.png) ℹ️*这篇文章基于 Go 1.13 ...

  • 120
    Go 中的循环是如何转为汇编的?

    ![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20200201-how-are-loops/cover.png) *本文基于 Go 1.13 版本* 循环在编程中是一个重要的概念,且易于...

  • 120
    Go 语言如何实现垃圾回收中的 Stop the World (STW)

    ![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images/master/how-does-go-stop-the-world/cover.png) *本篇文章讨论实现原理基于 Go 1.13.* 在垃圾回收机制 (...

  • 使用 timeout、deadline 和 context 取消参数使 Go net/http 服务更灵活

    关于超时,可以把开发者分为两类:一类是了解超时多么难以捉摸的人,另一类是正在感受超时如何难以捉摸的人。 超时既难以捉摸,却又真实地存在于我们生活的由网络连接的世界中。在我写这篇文章的同时,隔壁两个同事正在用他们的智能手机打字,也许是在跟与他们相距万里的人聊天。网络使这一切变为可能。 这里要说的是网络及其复杂性,作为写网络服务的我们,必须掌握如何高效地驾驭它们,并规避它们的缺陷。 闲话少说,来看看超时和它们是如何影响我们的 `net/http` 服务的。 ## 服务超时 —...

  • 120
    Go:g0,特殊的 Goroutine

    ![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20200104-Go-g0-Special-Goroutine/cover.png) ℹ️ 这篇文章基于 Go 1.13。 在 Go 中创...

  • Go 语言中 runtime.KeepAlive() 方法的一些随笔

    我在看 go101 网站的 [类型不安全指针](https://go101.org/article/unsafe.html)[(来源)](https://old.reddit.com/r/golang/comments/8ll6lf/how_to_safely_use_typeunsafe_pointers_in_go/) 一文时,偶然发现了 [runtime](https://golang.org/pkg/runtime/) 库的一个有趣的新方法 [runtime.KeepAlive()](h...

  • Go 中的 Goroutine 和其他并发处理方案的对比

    Go 语言让使用 Goroutine 和通道变得非常有吸引力,作为在 Go 中进行并发的主要方式,它们是被有意识的提出的。因此对于你所遇到的任何与并发相关的问题,它们都可能成为首选方案。但是我不确定它们是否适合于我遇到的所有问题,我仍在考虑其中的平衡点。 通道和 Goroutine 对于查询共享状态(或从共享状态中获取某些信息)这类问题看起来似乎并不完全契合。假设你想要记录那些与服务端建立 TLS 通信失败的 SMTP 客户端的 IP,以便在 TLS 握手失败的情况下,不再提供 TLS 通...

  • 关于 CGO 的字符串函数的解释

    [cgo](https://github.com/golang/go/wiki/cgo) 的大量文档都提到过,它提供了四个用于转换 Go 和 C 类型的字符串的函数,都是通过复制数据来实现。在 CGo 的文档中有简洁的解释,但我认为解释得太简洁了,因为文档只涉及了定义中的某些特定字符串,而忽略了两个很重要的注意事项。我曾经踩过这里的坑,现在我要详细解释一下。 四个函数分别是: ```go func C.CString(string) *C.char func C.GoString...

  • Go 切片的一种有趣内存泄漏方式

    今天我在看 Prashant Varanasi 的 Go 发布会演讲:[使用火焰图进行生产分析](https://www.youtube.com/watch?v=aAhNDgEZj_U)(Analyzing production using Flamegraphs),在演讲开始的第 28 分钟他提到了一种涉及切片的有趣且棘手的内存泄漏。为了自我提升,我将在这里写一下该内存泄漏的一种形式,并说明它是如何发生的。 首先,对于像 Go 这样的垃圾收集语言来说,**内存泄漏是保留了对对象的非预期引...

  • Go 运行时调度器处理系统调用的巧妙方式

    [goroutine](https://tour.golang.org/concurrency/1) 是 Go 的一个标志性特点,是被 Go 运行时所管理的轻量线程。Go 运行时使用[一个 M:N 工作窃取调度器](https://rakyll.org/scheduler/)实现 goroutine,将 Goroutine 复用在操作系统线程上。调度器有着特殊的术语用来描述三个重要的实体;G 是 goroutine,M 是 OS 线程(一个“机器 machine”),P 是“处理器(proces...

  • 120
    Go: 延长变量的生命周期

    ![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20191002-Go-Keeping-a-Variable-Alive/00.png) 本文基于 Go 1.13。 在 Go 中,我们不需...

  • 120
    Go:内存管理分配

    ![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20191103-Go-Memory-Management-and-Allocation/cover.png) ℹ️ *这篇文章基于 Go 1.1...

  • 120
    Go 各版本回顾

    ![Illustration created for “A Journey With Go”, made from *the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images2/master/Go-Retrospective/00.png) 对每一个开发者来说,Go 的发展历史是必须知道的知识。了解几年来每个发行版本的主要变化,有助于...

  • unsafe 真就 unsafe 吗 - part1

    ## unsafe 包详解 在乌克兰的利沃夫举行的 [Lviv Golang community event](https://www.facebook.com/events/470065893928934/482981832637340/?notif_t=admin_plan_mall_activity&notif_id=1580732874088578) 中,我发表了一个关于 `unsafe` 包的演讲,这个演讲中我尝试回答了标题中提到的问题:`unsafe` 包究竟有多 unsafe...

  • 120
    Go:跨团队协作时共享对象

    ![Illustration created for “A Journey With Go”, made from *the original Go Gopher, created by Renee French.*](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20190622-Go-Shared-Objects-for-Cross-Team-Collaboration/00.png) 在一个公司中,...

  • 120
    Go:defer 语句如何工作

    ![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images2/master/how-does-defer-statement-work/1.png) ℹ️ *这篇文章基于 Go 1.12。* [`defer` 语句]...

  • 120
    Go:通过 GODEBUG 提升对协程的利用

    ![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20190606-Go-Improve-the-Usage-of-Your-Goroutines-with-GODEBUG/00.png) Go ...

  • Go 中的内联优化

    本文讨论 Go 编译器是如何实现内联的以及这种优化方法如何影响你的 Go 代码。 *请注意:*本文重点讨论 *gc*,实际上是 [golang.org](https://github.com/golang/go) 的 Go 编译器。讨论到的概念可以广泛用于其他 Go 编译器,如 gccgo 和 llgo,但它们在实现方式和功能上可能有所差异。 ## 内联是什么? 内联就是把简短的函数在调用它的地方展开。在计算机发展历程的早期,这个优化是由程序员手动实现的。现在,内联已经成为编译...

  • 优化 Golang 服务来减少 40% 以上的 CPU

    十年前,谷歌正在面临一个由 C++ 编译时间过长所造成的严重瓶颈,并且需要一个全新的方式来解决这个问题。谷歌的工程师们通过创造了一种新的被称作 Go (又名 Golang)的语言来应对挑战。这个新语言 Go 带来了 C++ 最好的部分(最主要的是它的性能和稳定性),又与 Python 的速度相结合,使得 Go 能够在实现并发的同时快速地使用多核心。 在 Coralogix(译者注:一个提供全面日志分析的服务产品,[官网](https://coralogix.com/)),我们为了去给我们的...

  • Go 编译器内部知识:向 Go 添加新语句-第 2 部分

    这是探讨 Go 编译器两篇文章的最后一篇。在[第 1 部分中](https://studygolang.com/articles/25101),我们通过构建自定义的编译器,向 Go 语言添加了一条新语句。为此,我们按照此图介绍了编译器的前五个阶段: ![go compiler flow](https://raw.githubusercontent.com/studygolang/gctt-images/master/compiler-internal/go-compiler-flow.pn...

  • 在 Go 语言中,我为什么使用接口

    强调一下是**我个人**的见解以及接口在 **Go 语言**中的意义。 如果您写代码已经有了一段时间,我可能不需要过多解释接口所带来的好处,但是在深入探讨 Go 语言中的接口前,我想花一两分钟先来简单介绍一下接口。 如果您对接口很熟悉,请先跳过下面这段。 ## 接口的简单介绍 在任一编程语言中,接口——方法或行为的集合,在功能和该功能的使用者之间构建了一层薄薄的抽象层。在使用接口时,并不需要了解底层函数是如何实现的,因为接口隔离了各个部分(划重点)。 跟不使用接口相比,...

  • 使用 JSON 协议的 gRPC

    JSON payload 实现简易的请求和响应的内省。 ## 介绍 大家经常说 gRPC 是基于 [Google Protocol Buffers](https://developers.google.com/protocol-buffers/) payload 格式的,然而这不完全正确。gRPC payload 的*默认*格式是 Protobuf,但是 gRPC-Go 的实现中也对外暴露了 `Codec` [interface](https://godoc.org/google.g...

  • 为什么你的 64-bit 程序可能占用巨大的虚拟空间

    出于很多目的,我从最新的 Go 系统内核开发源码复制了一份代码,在一个正常的运行环境中构建(和重新构建)它,在构建版本基础上周期性地重新构建 Go 程序。近期我在用 `ps` 查看我的[一个程序](https://github.com/siebenmann/smtpd/)的内存使用情况时,发现它占用了约 138 GB 的巨大虚拟空间(Linux ps 命令结果的 `VSZ` 字段),尽管它的常驻内存还不是很大。某个进程的常驻内存很小,但是需要内存很大,通常是表示有内存泄露,因此我心里一颤。 ...

  • 在 Go 语言中,有时 nil 并不是一个 nil

    今天,我遇到了一个 [Go FAQ](http://golang.org/doc/faq#nil_error)。首先,作为一个小小的 Go 语言测验,看看您是否在 Go playground 中运行该程序之前就能推断出它应该打印出的内容(我已经将程序放在侧边栏中,以防它在 Go playground 上消失)。该程序的关键代码是: ```go type fake struct { io.Writer } func fred (logger io.Writer) { if l...

  • 用 cgo 生成用于 cgo 的 C 兼容的结构体

    假设([并非完全假设,这里有 demo](https://github.com/siebenmann/go-kstat/))你正在编写一个程序包,用于连接 Go 和其它一些提供大量 C 结构体内存的程序。这些结构可能是系统调用的结果,也可能是一个库给你提供的纯粹信息性内容。无论哪种情况,你都希望将这些结构传递给你的程序包的用户,以便他们可以使用这些结构执行操作。在你的包中,你可以直接使用 cgo 提供的 C.<whatever> 类型。但这有点恼人(这些整型它们没有对应的原生 Go 类型,使得与...

  • Go 中的动态作用域变量

    这是一个 API 设计的思想实验,它从典型的 Go 单元测试惯用形式开始: ```go func TestOpenFile(t *testing.T) { f, err := os.Open("notfound") if err != nil { t.Fatal(err) } // ... } ``` 这段代码有什么问题?断言 `if err != nil { ... ...

  • Go 调度器的任务窃取(Work-Stealing)

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-work-stealing-in-go-Scheduler/cover.png) > Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French. ℹ️ *这篇文章基于 Go 1.13 环境。* ...

  • 编写友好的命令行应用程序

    我来给你讲一个故事... 1986 年,[Knuth](https://en.wikipedia.org/wiki/Donald_Knuth) 编写了一个程序来演示[文学式编程](https://en.wikipedia.org/wiki/Literate_programming) 。 这段程序目的是读取一个文本文件,找到 n 个最常使用的单词,然后有序输出这些单词以及它们的频率。 Knuth 写了一个完美的 10 页程序。 Doug Mcllory 看到这里然后写了 `tr ...

  • Go:内存管理与内存清理

    ![](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20191109-Go-Memory-Management-and-Memory-Sweep/01.png) <p align="center">Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French....

  • Go 中的性能测量

    Vincent Blanchon 2019 年 9 月 19 日 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/intrumentation-in-go/1.png) “A Journey With Go” 专属插图,由 Renee French 根据原始 Go Gopher 制作。 ℹ️ *本文基于 Go 1.13.* `go test` 命令提供了许多出色的功能,比如代码...

  • 了解 Go 的不可寻址值和切片

    Dave Cheney 最近在 Twitter 上发布了一个 Go 的小测验,和往常一样,我从中学到了一些有趣的东西。让我们从他的推文开始: `#golang` 小测验:该程序打印什么? ```go package main import ( "crypto/sha1" "fmt" ) func main() { input := []byte("Hello, playground") hash := sha1.Sum(input)...

  • Go 中的黑桃 A:使用结构体创建命名空间

    假设,但不是凭空想象,在你的程序中,你注册了一堆 [expvar 包的统计变量](https://golang.org/pkg/expvar/),用来在暴露出去的 JSON 结果中能有一个容易辨识的名字。普通的实现方式下,你可能会有一大堆全局变量,对应着程序追踪的各种信息。这些变量与其他的全局变量混成一团,这毫无美感,如果我们能规避这种情况,那么事情会变得不那么糟糕。 归功于 Go 对匿名结构类型的支持,我们可以实现。我们可以基于匿名结构类型创建一个变量集合的命名空间: ```go ...

  • 为什么 Go 关心 unsafe.Pointer 和 uintptr 之间的差别

    Go 有两样东西或多或少是无类型指针的表示:uintptr 和 unsafe.Pointer (和外表相反,它们是内置类型)。 从表面上看这有点奇怪,因为 unsafe.Pointer 和 uintptr 可以彼此来回转换。为什么不只有一种指针表现形式?两者之间有什么区别? 表面的区别是可以对 uintptr 进行算数运算但不能对 unsafe.Pointer(或任何其他 Go 指针)进行运算。unsafe 包的文档指出了重要的区别: > uintptr 是整数,不是引用。将 Po...

  • Go:随机数是怎样产生的?

    ![](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20191202-Go-How-Are-Random-Numbers-Generated/01.png) <p align="center">Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.</p>...

  • Go GC 怎么标记内存?

    ![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20191103-Go-How-Does-the-Garbage-Collector-Mark-the-Memory/00.png) ℹ️ 本文基于...

  • Go: GC 是怎样监听你的应用的?

    ![](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20191002-Go-How-Does-the-Garbage-Collector-Watch-Your-Application/1.png) <p align="center">Illustration created for “A Journey With Go”, made from the original Go Gopher, create...

  • 在 Golang 中使用 -w 和 -s 标志

    今天的博客文章来自 Valery,这是 [Spiral Scout](https://spiralscout.com/) 的一名高级软件工程师,专门从事 Golang(Go)开发。 作为在 Golang 以及许多其他编程语言方面具有专业知识的软件开发机构,我们知道对于我们的工程师和质量保证专家而言,能够与社区分享他们的知识和经验非常重要。 感谢 Valery 这篇出色的文章和有用的 Golang 测试技巧! 当我在 GitHub 上查找一些良好的工程实践以备应用时,我注意到许多开发人...

  • 在 Go 中编写令人愉快的 HTTP 中间件

    在使用 Go 编写复杂的服务时,您将遇到一个典型的主题是中间件。这个话题在网上被讨论了一次又一次。本质上,中间件允许我们做了如下事情: * 拦截 `ServeHTTP` 调用,执行任意代码 * 对调用链(Continuation Chain) 上的请求/响应流进行更改 * 打断中间件链,或继续下一个中间件拦截器并最终到达真正的请求处理器 这些与 express.js 中间件所做的工作非常类似。我们探索了各种库,找到了接近我们想要的现有解决方案,但是他们要么有不要的额外内容,要么不...

  • Go 语言中的集成测试:第二部分 - 设计和编写测试

    ## 序幕 这篇文章是集成测试系列两个部分中的第二部分。你可以先读 [第一部分:使用 Docker 在有限的环境中执行测试](https://studygolang.com/articles/21759)。本文中的示例可以从 [代码仓库](https://github.com/george-e-shaw-iv/integration-tests-example) 获取。 ## 简介 > “比起测试行为,设计测试行为是已知的最好的错误预防程序之一。” —— Boris Beizer 在执行...

  • Go 字符串中的潜在问题

    在我之前的文章 [Go 中我喜欢的东西](https://utcc.utoronto.ca/~cks/space/blog/programming/GoThingsILike)中提到过,我喜欢的 [Go](https://golang.org/) 的东西其中之一就是它的字符串(通常还有切片)。从一个 Python 开发者的角度看,它们之所以伟大,是因为创建它们时开销很少,因为它们通常不需要复制。在 Python 中,任何时候操作字符串都需要复制一部分或全部字符串,而 [这很容易对性能造成影响](...

  • GopherCon 2019 - Go 模块代理:查询的生命周期

    ## 概述 Go 团队已经搭建了模块镜像与校验和数据库,这将提升 Go 生态环境的可靠性与安全性。这次的交流会通过 go 命令、代理与校验和数据库讨论经过身份验证的模块代理的技术细节。 ## 介绍 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/module-life-of-query/go-module-proxy-life-of-a-query-katie.jpg) Katie ...

  • 120
    如何选择一门编程语言

    > 我应该学习哪种编程语言? ![](https://raw.githubusercontent.com/studygolang/gctt-images2/master/how-to-choose-a-programming-language/1.jpg) 如果你看到这篇文章,很有可能,在你的职业生涯中,你至少有一次在思考应该选择哪种语言。或者你甚至在编程生涯开始之前就已经考虑了。很高兴你能看到这篇文章。 我本人经常地(甚至可能过多地)去思考这个问题。不仅如此,我还会在实践中尝...

  • 我是如何在 Go 中组织包的

    构建项目跟写代码一样具有挑战性。而且有很多种方法。使用错误的方法可能会让人很痛苦,但若要重构则又会非常耗时。另外,要想在一开始就设计出完美的程序几乎是不可能的。更重要的是,有些解决方法只适用于某特定大小的程序,但是程序的大小又是随着时间变化和增长的。所以我们的软件应该跟着出现过解决过的问题一起成长。 我主要从事微服务的开发,这种架构非常适合我。其他领域或其他基础架构的项目可能需要不同的方法。请在下面的评论中告诉我您的设计和最有意义的地方。 ## 包及其依赖 在开发微服务时,按组...

  • 在 5 分钟之内部署一个 Go 应用

    在有些程序人写完了他们的 Go 应用之后,这总会成为一个大问题——“我刚写的这个 Go 应用,当它崩溃的时候我要怎么重启?”,因为你没法用 `go run main.go` 或者 `./main` 这样的命令让它持续运行,并且当程序崩溃的时候能够重启。 一个普通使用的好办法是使用 Docker。但是,设置 Docker 以及为容器配置你的应用需要花费时间,当你的程序需要和 MySQL、Redis 这样的服务器/进程交互时更是如此。对于一个大型或长期项目来说,毋庸置疑这是一个正确的选择。但是...

  • 类似 Go 中的表格驱动测试的步骤驱动评估

    如果你听说过表驱动测试,那你就能更容易理解本文所描述的概念,因为它们使用的是相同的技术,只不过本文使用在非测试场景中。 假设你有一个函数,该函数中调用了多个其他函数。那么这个函数很可能主要有两个作用: 1. 检查出现的所有错误返回。 2. 传递一个函数的输出作为另一个函数的输入。 ```go // process is an example pipeline-like function. func queryFile(filename, queryText string)...