![](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 环境。* ...
-
Go 调度器的任务窃取(Work-Stealing)
-
编写友好的命令行应用程序
我来给你讲一个故事... 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 ...
-
如何选择一门编程语言
> 我应该学习哪种编程语言? ![](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)...
-
Go 语言 Protobuf 教程之 Message
在序列化结构数据的各种方式中,protocol buffer(或 protobuf)是资源开销最小的一种。protobuf 需要客户端和服务端都知道数据结构而且兼容,不像 JSON 那样结构本身就是编码的一部分。 ## Protobuf 和 Go 最基本的 protobuf message 定义像下面这样: ```protobuf message ListThreadRequest { // session info string sessionID = 1; ...
-
Go 微服务中的熔断器和重试
今天我们来讨论微服务架构中的自我恢复能力。通常情况下,服务间会通过同步或异步的方式进行通信。我们假定把一个庞大的系统分解成一个个的小块能将各个服务解耦。管理服务内部的通信可能有点困难了。你可能听说过这两个著名的概念:熔断和重试。 ## 熔断器 ![01](https://raw.githubusercontent.com/gctt-images2/blob/master/circuit-breaker-and-retry/01.png) 想象一个简单的场景:用户发出的请求访问服...
-
Go:协程,操作系统线程和 CPU 管理
![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-goroutines-os-thread-and-cpu-management/00.png) ℹ️ *本文运行环境为 Go 1.13* ...
-
用 70 行 Go 代码击败 C 语言
Chris Penner 最近发布的一篇文章 [Beating C with 80 Lines of Haskell](https://chrispenner.ca/posts/wc) 引发了 Internet 领域内广泛的论战,进而引发了一场用不同语言实现 `wc` 的圣战: - [Ada](http://verisimilitudes.net/2019-11-11) - [C](https://github.com/expr-fi/fastlwc/) - [Common Lisp]...
-
从 Travis 迁移至 GitHub Actions
周末的时候,我决定将我 Go 语言的开源项目 [Flipt](https://github.com/markphelps/flipt) 的 CI 流程从 TravisCI 转移到 GitHub Actions,我想要替换我现有的 CI,并尝试使用新的 GitHub Actions 将手动发版过程自动化。 *说明*:我在 GitHub 工作,但不在 Actions 团队。我想在我的开源项目中配置 Actions,并且不从 Actions 团队或 GitHub 的任何人那里获得任何帮助。我没有...
-
Gocache:一个功能齐全且易于扩展的 Go 缓存库
在先前几周的时候,我完成了 [Gocache](https://github.com/eko/gocache),对于 Go 开发者而言,它是功能齐全且易于扩展的。 这个库的设计目的是为了解决在使用缓存或者使用多种(多级)缓存时所遇到的问题,它为缓存方案制定了一个标准。 ## 背景 当我一开始在为 GraphQL 的 Go 项目构建缓存时,该项目已经包含了一套有简单 API 的内存缓存,还使用了另外一套有不同 API 的内存缓存和加载缓存数据的代码,它们实际上都是在只做了同一件事...
-
构建一个快速的现代化网络爬虫
很久以来,我一直对网络爬虫充满热情,特别是它背后的理论。我曾经使用过许多语言来构建它,例如:C++、JavaScript(Node.JS)、Python 等。 但是首先,什么是网络爬虫? ## 什么是网络爬虫? 网络爬虫是一个计算机程序,它通过浏览互联网来将现有的网页、图像、PDF 等编入索引,并允许用户使用[搜索引擎](https://en.wikipedia.org/wiki/Web_search_engine)来检索这些内容。 这基本上就是著名的[谷歌搜索引擎](http...
-
使用 Hugo 和 Github Pages 创建你的开发者作品集
拥有一个作品集网站可以使你在寻找一个开发外包时脱颖而出。作品集网站可以让潜在的客户或雇主了解你是一个专家,了解你过去和正在做的工作。不幸的是,一些常见的困难阻碍了许多人拥有作品集网站,包括最近的我--害怕所有的工作,计划并且从一个草图中构建一个网站,选择一个主机提供商,如果你想域名可用,那些主机和域名会让你破费(特别当你缺钱的时候)等等。 在本指导中,我会带领你快速且免费的建立并且上线你的工作集网站。 ## 但是,首先 ... 有一个作品集网站真的那么重要吗? 当然。以下是原因...
-
解密为何 Golang 能从众多语言中脱颖而出
技术的突飞猛进,推动着世界上许多突破性的发现。 Golang ,作为如此革命性的发明,早已征服了整个世界。 当我们接触到 Golang 后,开发领域中已经发现了很多种(用 Golang)带来进步和革新的方法。在语言的万马千军纷纷争奇斗艳时,Golang 早已证明了自己才是最大的游戏规则改变者。 虽然对于初学者来说,这种新生的语言可能有一点点复杂和难以掌握,但是当你做了充足的练习后,你会很容易地处理 Golang 语言。 在(开发者)熟识关于 Golang 的一些基础知识之前,他...
-
Go 官方博文 Module 第四部分:v2 及更高版本
## 简介 本文是 Go modules 系统的第四部分 - Part 1: [使用 Go Modules](https://blog.golang.org/using-go-modules) [译文](https://studygolang.com/articles/19334) - Part 2: [迁移到 Go Modules](https://blog.golang.org/migrating-to-go-modules) [译文](https://studygolan...
-
Go 官方博文 Module 第三部分:发布 Go Modules
## 简介 本文是 go modules 系统的第三部分 - Part 1: [使用 Go Modules](https://blog.golang.org/using-go-modules) [译文](https://studygolang.com/articles/19334) - Part 2: [迁移到 Go Modules](https://blog.golang.org/migrating-to-go-modules) [译文](https://studygolan...
-
Golang Http 服务的优雅重启
(2015 年 4 月更新):[Florian von Bock](https://github.com/fvbock) 已将本文中描述的内容实现成了一个名为[Endless](https://github.com/fvbock/endless)的 Go 程序包。 对于 Golang HTTP 的服务,我们可能需要重启来升级或者更改某些配置。如果你(像我曾经一样)因为网络服务器对优雅重启很重视就理所当然地认为它(优雅重启)早已实现了,那么这份教程将会对你很有用处。因为在 Golang 中,...
-
Go 中基于 IP 地址的 HTTP 限流
如果你想限制一个正在运行的 HTTP 服务的请求量,你可以使用现有的轮子工具,比如说 [github.com/didip/tollbooth](https://github.com/didip/tollbooth) ,但是如果写一些简单的东西,你自己去实现也没有那么难。 我们可以用这个包 `x/time/rate` 。 在这篇教程中,我们将基于用户的 IP 地址构造一个简单的限流中间件。 ## Pure HTTP Server 我们来开始构建一个简单的 HTTP 服务,这...
-
语法糖的代价
在 GO 语言中,你可以用少量的代码表达很多东西。您通常可以查看一小段代码并清楚地了解此程序的功能。这在 Go 社区中被称为地道的 GO 代码。保持跨项目代码的一致性需要持续不断地努力。 当我遇到 Go 的部分看起来不像地道 GO 代码时,这通常是有原因的。最近,我注意到 Go 中的接口切片(或抽象数组)工作方式有点怪异。这种怪异有助于理解在 Go 中使用复杂类型会带来一些成本,而且这些[语法糖](https://en.wikipedia.org/wiki/Syntactic_sugar)...
-
Go 程序的包含物:Go 程序中的非 Go 后缀文件
静态文件,也有人叫资产或资源,是一些被程序使用、没有代码的文件。在 Go 中,这类文件就是非 `.go` 的文件。它们大部分被用在 Web 内容,像 HTML 、javascript 还有网络服务器处理的图片,然而它们也可以以模板、配置文件、图片等等形式被用在任何程序中。主要问题是这些文件不会随代码一起被编译。开发一个程序时,我们可以通过本地的文件系统访问它们,但是当软件被编译和部署后,这些文件就不再在部署环境中的本地文件系统了,我们必须提供给程序一种访问它们的方式。Go 语言对这个问题并没有提...
-
Go 编译器内核:给 Go 新增一个语句 —— 第一部分
这是两部分系列文章中的第一部分,该文章采用教程的方式来探讨 Go 编译器。Go 编译器复杂而庞大,需要一本书才可能描述清楚,所以这个系列文章旨在提供一个快速而深度优先的方式进入学习。我计划在以后会写更多关于编译器领域的描述文章。 我们会修改 Go 编译器来增加一个新的(玩具性质)语言特性,并构建一个经过修改的编译器进行使用。 ## 任务 —— 增加新的语句 很多语言都有 `while` 语句,在 Go 中对应的是 `for`: ```go for <some-condi...
-
Go 标准库 encoding/json 真的慢吗?
![](https://github.com/studygolang/gctt-images2/blob/master/go-is-the-encoding-json-package-really-slow/A-Journey-With-Go.png) 插图来自于“A Journey With Go”,由 Go Gopher 组织成员 Renee French 创作。 本文基于 Go 1.12。 关于标准库 `encoding/json` 性能差的问题在很多地方被讨论过,也有很...
-
Go 最小硬件编程(第三部分)
[![STM32F030F4P6](https://ziutek.github.io/images/mcu/f030-demo-board/board.jpg)](https://ziutek.github.io/2018/05/03/go_on_very_small_hardware3.html) 本系列的第一部分和第二部分中讨论的大多数示例都是以一种或另一种方式闪烁 LED。起初它可能很有趣,但过了一段时间它变得有点无聊。让我们做一些更有趣的事情...... ......让我们点...
-
Go 中记录 HTTP 请求
如果你有运行的 HTTP 服务,你可能想记录 HTTP 请求。 请求日志有助于诊断问题。(哪些请求失败了?我们一天处理多少请求?哪些请求比较慢?) 这对于分析是必需的。(哪个页面受欢迎?网页的浏览者都来自哪里?) 这篇文章介绍了在 Go Web 服务器中,记录 HTTP 请求日志相关的全部内容。 这不是关于可复用的库,而是关于实现你自己的解决方案需要知道的事情,以及关于我日志记录的选择的描述。 你可以在示例应用上查看详细内容: https://github.com/...
-
只用 3 步构建 Go docker 最小镜像
![DockerGopher](https://raw.githubusercontent.com/studygolang/gctt-images/master/build-mini-docker-image/DockerGopher.png) ## Go——仅需三个步骤即可构建最小的 Docker 映像 当您为 docker 构建 Go 应用程序时,通常从诸如 `golang:1.13` 之类的映像开始。但将这个映像实际运行时会浪费资源。让我们看一下如何将 Go 应用程序构建为绝对...
-
Go 项目的布局
Kyle C. Quest 2017年9月12日 · 5 min 阅读 读过了 [`Tour of Go`](https://tour.golang.org/?source=post_page---------------------------),在 [https://play.golang.org/](https://play.golang.org/?source=post_page---------------------------) 上把玩过,然后你感觉你准备好写一些代码了。很...
-
Module 第 1 部分:为什么和做什么
## 引言 Module 针对自 Go 语言初版发布以来即成为开发者痛点的三个关键问题提供了完整的解决方案,使得开发者: * 能够在 GOPATH 工作区之外使用 Go 代码; * 能够对依赖包进行版本控制并识别可以使用的最兼容版本; * 能够使用 Go 原生工具来管理依赖包; 随着 Go 语言 1.13 版本的发布,这三个问题已经成为了“过去时”。在过去的两年中,Go 语言团队花费了很多精力才让所有人达到这一步。在本文中,我将重点介绍从 GOPATH 到 module 的...
-
Go 垃圾回收:第三部分 - GC 的步调
## 前言 这是三篇系列文章中的第三篇。该系列文章提供了一种对 Go 垃圾回收背后的机制和概念的理解。本篇的主要内容是 GC 如何控制自己的步调。 三篇文章的索引:<br> 1)[Go 垃圾回收:第一部分 - 概念](https://www.ardanlabs.com/blog/2018/12/garbage-collection-in-go-part1-semantics.html)<br> 2)[Go 垃圾回收:第二部分 - GC 追踪](https://www.ardanl...
-
Go1.13 推出模块镜像和校验和数据库 —— 官方博文
> Module Mirror and Checksum Database Launched 我们很高兴地分享我们的模块 [镜像](https://proxy.golang.org/) ,[索引](https://index.golang.org/) 和 [校验和数据库](https://sum.golang.org/) 现已准备就绪! 对于 [Go 1.13 模块用户](https://golang.org/doc/go1.13#introduction) ,go 命令将默认使用模块镜像...
-
Go 编译器概述
![](https://raw.githubusercontent.com/studygolang/gctt-images2/master/go-overview-of-compile/go-compiler.png "'Golang 之旅'插图,由 Go Gopher 的 Renee French 创作") > *本文基于 Go 1.13* Go 编译器是 Go 生态系统中的一个重要工具,因为它是将程序构建为可执行二进制文件的基本步骤之一。编译器的历程是漫长的,它先用 C 语言编写...
-
传递回调函数和指针到 Cgo
`Cgo`允许 Go 程序调用 C 库或其他暴露了 C 接口的库。正是如此,这也成为 Go 程序员工具箱的重要组成部分。 使用`Cgo`可能会比较棘手,特别是在 Go 和 C 代码中传递指针和回调函数时。 这篇文章讨论了一个端到端当例子,包含了如下几方面: * `Cgo`的基本使用,包括链接一个传统的 C 库到 Go 二进制文件中。 * 从 Go 语言中传递 struct 到 C 语言中。 * 传递 Go 函数到 C 程序中,并安排 C 程序在随后调用它们。 * 安全的传递任...
-
理解 Go 的空接口
<!-- https://raw.githubusercontent.com/studygolang/gctt-images2/master/go-vet-command-is-more-powerful-than-you-think/go-vet.png 图片链接模板 --> !["Golang 之旅"插图,由 Go Gopher 的 Renee French 创作](https://raw.githubusercontent.com/studygolang/gctt-images2/mas...
-
在 Go 中使用微服务架构的好处
## 前言 我们已经讨论“微服务架构”很长一段时间了。它是软件架构中最新的热门话题。那么什么是微服务呢?我们为什么要使用它?为什么要在 Golang 中使用微服务架构?它有哪些优点? 本文中,我将会探讨一些相关的问题。废话不多说,让我们开始吧。 ## 什么是微服务? 微服务是一种软件开发技术,属于 SOA(面向服务的架构)的一种形式。它的作用是,将应用程序构建为许多松耦合的服务的集合。在这种架构中,服务的编码通常是细粒度的,服务的协议更轻量。目前还没有对微服务的准确定义,但它有一...
-
Go 中的并发 bug
Go 目前正在通过新的并发原语(concurrency primitives)goroutine 和 channel 试图简化并发编程并减少报错。但是,实际情况怎么样呢?两位来自宾夕法尼亚州立大学和普渡大学的研究员 [Yiying Zhang](https://www.linkedin.com/in/yiyingzhang) 和 [Linhai Song](https://songlh.github.io/) 对 Go 中的 [并发bug在真实场景的情况](https://songlh.gith...
-
现代缓存设计-续集
这是 Benjamin Manes 的讲座文章,他曾在谷歌担任工程师,现在正在 Vector 担任 CTO 职务。 [前一篇文章](http://highscalability.com/blog/2016/1/25/design-of-a-modern-cache.html)描述了 [Caffeine](https://github.com/ben-manes/caffeine) 使用的缓存算法,特别是淘汰算法和并发模型。我们还对淘汰算法进行了改进,并探索了一种新的到期方法。 ## ...
-
Golang 初体验
我最近决定在一个新项目中使用 GoLang 来实现一组增删改查的 API。在此之前,我较为熟悉 Java,Groovy,了解一些 Python。 我大部分的经验都是使用 Java 或者 Groovy 加上 Spring Boot。这让我感到有些无聊,所以为什么不来学点儿东西找找乐子呢? ## 要求 以下是一些要求。 * 设计并实现领域数据模型 * 实现增删改查 API * 在后端使用 Mongo 数据库 * 必须有 Swagger 文档 API 定义并且能方便的用多...