• 简化 Go 中对 JSON 的处理

    我的第一个 Go 工程需要处理一堆 JSON 测试固件并把 JSON 数据作为参数传给我们搭建的 API 处理。另一个团队为了给 API 提供语言无关的、可预期的输入和输出,创建了这些测试固件。 在强类型语言中,JSON 通常很难处理 —— JSON 类型有字符串、数字、字典和数组。如果你使用的语言是 javascript、python、ruby 或 PHP,那么 JSON 有一个很大的好处就是在解析和编码数据时你不需要考虑类型。 ```bash // in PHP $objec...

  • 120
    Go 中优化字符串的比较操作

    ![](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20200912-Optimizing-String-Comparisons-in-Go/00.jpeg) 你想让你的 Go 程序运行得更快些吗?优化下 Go 程序中的字符串比较可以减少程序的响应时间,以及增强它的可扩展性。对比两个字符串来检查它们是否相等需要一定的处理能力,并不是所有的比较操作都是相同的。 在之前的一篇文章中,我们研究了 [Go...

  • 120
    为什么不使用 Kubernetes

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

  • 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 创建一个简易负载均衡器

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

  • 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。...

  • 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:异步抢占

    ![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。 ...

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

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

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

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

  • 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/Go-Retrospective/00.png) 对每一个开发者来说,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/20190622-Go-Shared-Objects-for-Cross-Team-Collaboration/00.png) 在一个公司中,...

  • 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,但它们在实现方式和功能上可能有所差异。 ## 内联是什么? 内联就是把简短的函数在调用它的地方展开。在计算机发展历程的早期,这个优化是由程序员手动实现的。现在,内联已经成为编译...

  • 使用 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 中的黑桃 A:使用结构体创建命名空间

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

  • 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 字符串中的潜在问题

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

  • 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]...

  • 解密为何 Golang 能从众多语言中脱颖而出

    技术的突飞猛进,推动着世界上许多突破性的发现。 Golang ,作为如此革命性的发明,早已征服了整个世界。 当我们接触到 Golang 后,开发领域中已经发现了很多种(用 Golang)带来进步和革新的方法。在语言的万马千军纷纷争奇斗艳时,Golang 早已证明了自己才是最大的游戏规则改变者。 虽然对于初学者来说,这种新生的语言可能有一点点复杂和难以掌握,但是当你做了充足的练习后,你会很容易地处理 Golang 语言。 在(开发者)熟识关于 Golang 的一些基础知识之前,他...

  • 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...

  • Go 程序的包含物:Go 程序中的非 Go 后缀文件

    静态文件,也有人叫资产或资源,是一些被程序使用、没有代码的文件。在 Go 中,这类文件就是非 `.go` 的文件。它们大部分被用在 Web 内容,像 HTML 、javascript 还有网络服务器处理的图片,然而它们也可以以模板、配置文件、图片等等形式被用在任何程序中。主要问题是这些文件不会随代码一起被编译。开发一个程序时,我们可以通过本地的文件系统访问它们,但是当软件被编译和部署后,这些文件就不再在部署环境中的本地文件系统了,我们必须提供给程序一种访问它们的方式。Go 语言对这个问题并没有提...