GCTT - Go 中文翻译组

收录了 499 篇文章 · 339 人关注

  • 【Golang】不要在生产环境使用 http.DefaultServerMux

    # 【Golang】不要在生产环境使用 http.DefaultServerMux 我看到许多文章和帖子都显示了一种方便简单的方法来这样创建 go 的 Web 服务: ```golang package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Requ...

  • 120
    Go:死锁是如何触发的?

    ![illustration](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20200711-Go-How-Are-Deadlocks-Triggered/illustration.png) 由创作原始 Go Gopher 作品的 Renee French 为“ Go 的旅程”创作的插图。 *本文基于 Go 1.14。* 死锁是当 Goroutine 被阻塞而无法解除阻塞时产生的一种状态。G...

  • 120
    为什么不使用 Kubernetes

    ![When to choose Kubernetes?](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20200603-Why-Not-Use-Kubernetes/00.png) 很多团队都很兴奋地开始使用 Kubernetes。其中一些团队希望能充分利用它的弹性、灵活性、可移植性、可靠性以及其他的一些 Kubernetes 能原生地提供的优势。也有些团队只是热衷于技术,仅仅想使用下这个平台,来更好...

  • 我是如何在 Go 中构建 Web 服务的

    从用了近十年的 C# 转到 Go 是一个有趣的旅程。有时,我陶醉于 Go 的[简洁](https://www.youtube.com/watch?v=rFejpH_tAHM);也有些时候,当熟悉的 OOP (面向对象编程)[模式](https://en.wikipedia.org/wiki/Software_design_pattern)无法在 Go 代码中使用的时候会感到沮丧。幸运的是,我已经摸索出了一些写 HTTP 服务的模式,在我的团队中应用地很好。 当在公司项目上工作时,我倾向把可...

  • Golang 有多快?—— 对比 Go 和 Python 实现的 Eratosthenes 筛选法

    ![Photo by Max Duzij on Unsplash](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20200523-How-Fast-Is-Golang/Photo.jpeg) 时间宝贵,所以为什么浪费时间等待程序运行?除非过去几年与世隔绝,否则不会错过 Go 的兴起。由谷歌工程师 Robert Griesemer,Rob Pike 和 Ken Thompson [创造的](https:/...

  • 120
    Go:使用 Delve 和 Core Dump 调试代码

    ![由 Renee French 创作的原始 Go Gopher 为“ Go Go 之旅”创建的插图。](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20200523-Go-Debugging-with-Delve-and-Core-Dumps/Illustration.png) ℹ️ 这篇文章基于 Go Delve 1.4.1。 core dump 是一个包含着意外终止的程序其内存快照的文件。这个文...

  • 120
    Go:Goroutine 的切换过程实际上涉及了什么

    ![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/go-what-does-a-goroutine/1.png) 本文基于 Go 1.13 版本。 Goroutine 很轻,它只需要 2Kb ...

  • 120
    zap 高性能是如何做到的?

    ![插图由“go 之旅”提供,原图由 Renee French 创作](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20190815-go-how-zap-package-is-optimized/1__mMI_UYf-DsS04MU5AnRQg.png) Go 生态系统有许多流行的日志库,选择一个可以在所有项目中使用的日志库对于保持最小的一致性至关重要。易用性和性能通常是我们在日志库中考虑的两个指标。...

  • Go 中可取消的读取操作

    在使用 Go 进行工作时,使用 `io.Reader` 和 `io.Writer` 接口是最常见的情场景之一。这很合理,它们是数据传输的主力接口。 关于 `io.Reader` 接口,有一点令我困惑:它的 `Read()` 方法是阻塞的,一旦读取操作开始,你没有办法去抢占它。同样,也无法在读取操作上执行 `select` 操作,异步协调多个 `io.Reader` 时的读取操作会有点棘手。 `io.ReadCloser` 是 Go 提供的一个常用的退出通道,在许多情况下,它确实允许你...

  • Go:gops 如何与 runtime 交互?

    ![](hhttps://raw.githubusercontent.com/studygolang/gctt-images2/master/20200405-go-how-does-gops-interact-with-the-runtime/1_3PCyB5PhH_NEZoNnj693dA.png) 本文基于 Go 1.13 和 gops 0.3.7。 `gops` 旨在帮助开发人员诊断 Go 进程并与之交互。它提供了追踪运行中的程序数秒钟,通过 `pprof` 获取 CPU 的...

  • Go 1.14 中接口的菱形组合

    按照[部分重叠的接口提议](https://github.com/golang/proposal/blob/master/design/6977-overlapping-interfaces.md),Go 1.14 现在允许嵌入有部分方法重叠的接口。本文是一篇解释这次修改的简要说明。 我们先来看 io 包中的三个关键接口:io.Reader、io.Writer 和 io.Closer: ```go package io type Reader interface { Re...

  • 120
    Go:如何利用符号表

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-hwo-to-take-symbol-table/cover.png) > Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French. ℹ️ *本文基于 Go 1.13。* 符号表是由编译...

  • 120
    Go: Select 语句的执行顺序

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-ordering-in-select-statements/20200429220520.png) > 本文基于 Go 1.14 `select` 允许在一个 goroutine 中管理多个 channel。但是,当所有 channel 同时就绪的时候,go 需要在其中选择一个执行。此外,go 还需要处理没有 channel 就绪的情况,我们...

  • 120
    Go:GOMAXPROCS 和实时更新

    ![由 Renee French 创作的原始 Go Gopher 作品,为“ Go 的旅程”创作的插图。](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20191210-Go-GOMAXPROCS-And-Live-Updates/1_Ct_BMGzFD4eKn6ztnR1iYA.png) ℹ️ 这篇文章基于 Go 1.13。 `GOMAXPROCS` 控制着同时执行代码的 OS 线程的最大数量。...

  • 120
    用 Go 创建一个简易负载均衡器

    ![](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20191109-Lets-Create-a-Simple-Load-Balancer-With-Go/00.png) 负载均衡器在 Web 架构中扮演了很关键的角色。它们能在一组后端机器分配负载。这使得服务扩展性更好。因为配置了很多的后端机器,服务也因此能在某次请求失败后找到正常运行的服务器而变得高可用。 在使用了像 [NGINX](https...

  • 120
    Go 中的模糊(Fuzz)测试

    ![由 Renee French 创作的原始 Go Gopher 作品,为“ Go 的旅程”创作的插图。](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20191025-Go-Fuzz-Testing-in-Go/Illustration.png) 模糊测试(Fuzzing)是一项使用随机数据加载我们程序的测试技术。是[对常规测试的补充](https://docs.google.com/document...

  • 120
    使用 Go 构建 GraphQL API

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/building-an-api-with-graphql/cover.png) > 2020/5/16 更新:大家好,我刚刚更新了该项目以使用 Go module。不幸的是,[realize](https://github.com/oxequa/realize)很长时间没有更新并且无法正常工作。如果您想使用实时重新加载器,则还有其他选择,例如 [air]...

  • 如何写好 Go 代码

    我写了多年的 Go 微服务,并在写完两本关于 ([API Foundations in Go](https://leanpub.com/api-foundations) 和 [12 Factor Applications with Docker and Go](https://leanpub.com/12fa-docker-golang)) 主题的书之后,有了一些关于如何写好 Go 代码的想法 但首先,我想给阅读这篇文章的读者解释一点。好代码是主观的。你可能对于好代码这一点,有完全不同的想...

  • 120
    Go:使用 pprof 收集样品数据

    ![](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20200505-Go-Samples-Collection-with-pprof/00.png) > Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French. ℹ️ *本文基于 Go 1.13。...

  • Go 中没有引用变量

    先说清楚,在 go 中没有引用变量,所以更不存在什么引用传值了。 ## 什么是引用变量 在类 C++ 语言中,你可以声明一个别名,给一个变量安上一个其他名字,我们把这称为引用变量。 ```c #include <stdio.h> int main() { int a = 10; int &b = a; int &c = b; printf("%p %p %p\n", &a, &b, &c); // 0x7ffe114f0b14 0x7ffe114f0...

  • 重新学习 slice By Dave Cheney

    ## 数组 Arrays 每次讨论到 Go 的切片问题,都会从这个变量是不是切片开始,换句话说,就是 Go 的序列类型,在 Go 中,数组有两种关联属性。 1. 数组拥有固定的大小;`[5]int` 即表明是一个有 5 个 `int` 的数组,又与 `[3]int` 相区分开。 2. 他们是值类型。思考下面这个例子。 ```go package main import "fmt" func main() { var a [5]int b := a b[2] ...

  • Go 语言中命名规范——如何简短却更具描述性

    > 在计算机科学与技术中,有两件事情最难,第一是缓存无效,第二就是给一些东西命名 —— Phil Karlton 上面的话可不是一个笑话。写代码很容易,但是阅读起来却很痛苦。你是否有想知道一个变量具体指什么或者某个包的具体含义是什么这种类似的经历?这就是为什么我们需要一些规则和约定。 不过,约定虽然能够让我们的生活变得更轻松,但是也容易被高估和滥用。设置一些合理的命名约定和规则非常重要,不过盲目的遵循它也可能带来很多弊端。 在这篇文章里面,我将介绍在[Go](https://g...

  • 120
    Go:gsignal,信号的掌控者

    ![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/20200309-Go-gsignal-Master-of-Signals/00.png) ℹ️ *本文基于 Go 1.13。* `sign...

  • 120
    Go:并发以及调度器亲和

    ![由 Renee French 创作的原始 Go Gopher 作品,为“ Go 的旅程”创作的插图](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20200102-Go-Concurrency-And-Scheduler-Affinity/Illustration.png) 将 Goroutine 从一个 OS 线程切换到另一个线程需要一定开销,并且,如果这种操作过于频繁的话会降低应用性能。无论如何...

  • Go:Goroutine 与抢占机制

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-goroutine-and-preemption/cover.png) > Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French. *本篇文章讨论实现原理基于 Go 1.13.* Go 通...

  • 120
    Go: Goroutine 的堆栈大小是如何演进的

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/how-goroutine-stack-size-evolve/cover.png) > Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French. *本文基于 Go 1.12* Go 提供了一...

  • 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/)),我们为了去给我们的...