GCTT - Go 中文翻译组

收录了 388 篇文章 · 304 人关注

  • 120
    Go: 监控模式

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-monitor-pattern/1.png) Go 能实现[监控模式](https://en.wikipedia.org/wiki/Monitor_%28synchronization%29),归功于 `sync` 包和 `sync.Cond` 结构体。监控模式允许 goroutine 在进入睡眠模式前等待一个定特定条件,而不会阻塞执行或消耗资源。...

  • 为什么要使用 go module proxy

    在看过 `Go module` 的简介之后,我以为我已经知道了这个功能我需要知道的一切。但是很快,我意识到并不是这样。最近,人们开始提倡使用 `Go module proxy`。在研究了利弊之后,我得出结论,这将是近年来 Go 语言`最重要`的变化之一。 但为什么会这样呢?是什么让 `Go module` 代理如此特别? 使用 `Go modules` 时,如果向干净的缓存的计算机上添加新依赖项或构建 `Go module`,它将基于 `go.mod` 将下载(go get)所有依赖项,...

  • 无缓冲和有缓冲通道

    !["Go 之旅 插图,由 Go Gopher 的 Renee French 创作](https://raw.githubusercontent.com/studygolang/gctt-images2/master/buffered-and-unbufferd-channel/next-recvier.png) Go 中的通道(channel)机制十分强大,但是理解内在的概念甚至可以使它更强大。实际上,选择缓冲通道或无缓冲通道将改变应用程序的行为和性能。 ## 无缓冲通道 无...

  • 120
    Go Vet 命令:超出预期的强大

    !["Golang 之旅"插图,由 Go Gopher 的 Renee French 创作](https://raw.githubusercontent.com/studygolang/gctt-images2/master/go-vet-command-is-more-powerful-than-you-think/go-vet.png) Go `vet` 命令在编写代码时非常有用。它可以帮助您检测应用程序中任何可疑、异常或无用的代码。该命令实际上由几个子分析器组成,甚至可以与您的自定义...

  • 闲谈 Go 1.13 的错误处理

    Go 1.13 丰富了 `errors` 包。这些新增部分源自 [Go2 的错误监控提议](https://go.googlesource.com/proposal/+/master/design/29934-error-values.md)。那么让我们看看都有些啥吧 ~ Go 的错误是任意实现 `error` 接口的值。 ```go // The error built-in interface type is the conventional interface for //...

  • Go: Finalizers

    这篇文章基于 Go-1.12 版本 Go runtime 提供了一种允许开发者将一个函数与一个变量绑定的方法 `runtime.SetFinalizer`,被绑定的变量从它无法被访问时就被垃圾回收器视为待回收状态。这个特性引起了高度的争论,但本文并不打算参与其中,而是去阐述这个方法的具体实现。 ## 无保障性 举一个使用了 Finalizer 的例子 ```go package main import ( "fmt" "math/rand" "runt...

  • Go 内存管理之三

    之前在 [povilasv.me](https://povilasv.me/) 上,我们一起探讨了 [Go 内存管理](https://studygolang.com/articles/14956) 和 [Go 内存管理之二](https://studygolang.com/articles/22291)。在上篇博文中,我们发现使用 cgo 会占用更多的虚拟内存。现在我们来深入研究一下 cgo。 ## CGO 揭秘 正如之前所见,cgo 会使虚拟内存膨胀。此外,对于大部分用户而言,一...

  • ORM vs. 非 ORM

    我一直很喜欢使用 Go 的 database/sql 包来处理数据库。最近,一些涉及 Gorm 的问题激起了我对 Go 中 `使用 ORM` vs. `直接使用 database/sql` 的好奇心。在 ORM 方面曾有过丰富的经验,所以我决定开始一个实验:利用 Gorm 和 非 ORM 编写同一个简单的应用程序,并比较付诸的努力。 这促使我写下了一些关于 ORM 优缺点的想法。如果您对此感兴趣,请继续阅读! ## 非 ORM vs. ORM 的相关经验 实验中,定义了一个可作...

  • Docker 参考架构:设计可扩展、可移植的 Docker 容器网络

    ## 您将学到什么 Docker 容器将软件封装到一个完整的文件系统当中,这个文件系统包括软件运行所需的一切:代码、运行时、系统工具、系统库,所有能安装在服务器上的东西。这确保了软件在不同的环境下都能有相同的运行情况。默认情况下, 容器将各个应用彼此隔离开并将软件与底层基础设施隔离开,同时为应用提供额外的一层保护。 那如果应用需要和其他应用、主机或外部网络相互通信呢?您会如何在确保应用可移植性、服务发现、负载均衡、安全性、高性能和可扩展性的同时,设计一个拥有适当连通性的网络呢?本文档...

  • 120
    Go:关于 Cobra 的想法

    !["Golang之旅"插图,来自 Go Gopher 的 Renee French 创作](https://raw.githubusercontent.com/studygolang/gctt-images2/master/go-thoughts-about-cobra/A%20Journey%20With%20Go.png) Cobra 是 Golang 生态系统中最着名的项目之一。它简单,高效,并得到 Go 社区的大力支持。让我们来深入探索一下。 ## 设计 Cobra ...

  • 120
    Golang vs Python:选哪个?

    对开源开发来说 Golang 和 Python 哪个语言更好,我们详细分析对比一下。 在任何项目开始之前,大多开发团队需要通过多次会议讨论来确定最适合他们项目的编程语言。很多时候他们会在 Python 和 Golang 中间纠结。在这篇 Golang vs. Python 的博文中,我将亲自从多角度对比这两种语言,以帮你确定哪种语言最适合你。主要从以下几个方面比较: - 性能 - 可扩展性 - 应用 - 执行 - 库 - 代码可读性 让我们开始吧。在对比开始之前,让我...

  • Go 常量学习-可视化指南

    > Go 的类型常量和非类型常量是两个必须要了解的关键概念 不要忘记在文章下面有很多代码示例,因此你要确保点击这些链接并尝试运行这些程序。 ## 你为什么使用常量? ![why_might_you_use_constants?.image ](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-const-guide/1*r734fn1RBz1c1J2cKM7ZGw.png) 你不想在代码...

  • 120
    用Go构建不可变的数据结构

    ![Photo by Frantzou Fleurine on Unsplash](https://raw.githubusercontent.com/studygolang/gctt-images/master/building-immutable-data-structures-in-go/cover.jpeg) [共享状态](https://www.quora.com/What-is-the-meaning-of-shared-state-and-the-side-effects...

  • 120
    现代垃圾收集策略 —— Go 的 GC 策略

    ![ ](https://raw.githubusercontent.com/studygolang/gctt-images2/master/modern-garbage-collection/gc.jpeg) 在 [Hacker News](https://news.ycombinator.com/item?id=13218550) 和 [Reddit](https://www.reddit.com/r/golang/comments/5j7phw/modern_garbage_coll...

  • 避免诸如 base、util、common 之类的包名

    写一个好的 Go 语言包的开端是起一个好名字。将你的包名视为一个 elevator pitch,你必须用一个单词来说明。 包名不好的一个普遍的原因是被命名为 *utility*,这些包混合了 helpers 和 utility 代码,还包含了各种各样不相关的函数,因此根据它们提供的内容很难描述其作用。这经常导致一个包的名字取决于它所包含内容:实用工具(utilities)。 在开发一些深层次包结构的项目时,为了避免出现循环引用,同时复用辅助函数,通常会出现类似 *utils* 或 *...

  • 120
    Go:Context 和传播取消

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/context-and-cancellation-by-propagation/image_1.png) [context 包](https://blog.golang.org/context)在 Go 1.7 中引入,它为我们提供了一种在应用程序中处理 context 的方法。这些 context 可以为取消任务或定义超时提供帮助。通过 conte...

  • 使用 Go Modules(模块)进行依赖项迁移

    ## 介绍 本篇文章是 Go Modules 系列文章的第 2 部分。第 1 部分请参阅 [Go Modules 的使用方法(中文翻译版)](https://studygolang.com/articles/19334) [Using Go Modules(EN)](https://blog.golang.org/using-go-modules) Go 项目使用各种各样的依赖关系管理策略,像 `dep` 和 `glide` 这样的第三方依赖项[vendor](https...

  • 120
    Go 最小硬件编程(第二部分)

    [![STM32F030F4P6](https://raw.githubusercontent.com/studygolang/gctt-images/master/Very-Small-Hardware-Part2/1.jpeg)](https://ziutek.github.io/2018/04/14/go_on_very_small_hardware2.html) 在本文 [第一部分](https://studygolang.com/articles/22742) 的结尾,我说过要写...

  • 120
    Go:Test 包不为人知的一面

    ![test package](https://github.com/studygolang/gctt-images/blob/master/20190707-go-unknown-parts-of-the-test-package/test-pkg.png?raw=true) Go 被用得最频繁的命令我想应该是`go test`。然而,这个命令一些有趣的细节和用法可能你还不知道哟。下面让我们从测试本身讲起。 ## 规避缓存的习惯用法 如果连续两次运行同一份测试且第一次完全通过...

  • Goroutine 内存泄漏 - 被遗弃的接收者

    ## 介绍 Goroutine 内存泄漏是产生 Go 程序内存泄漏的常见原因。在我之前的[文章](https://www.ardanlabs.com/blog/2018/11/goroutine-leaks-the-forgotten-sender.html)中,我介绍了 Goroutine 内存泄漏,并展示了许多 Go 开发人员容易犯错的例子。继续前面的内容,这篇文章提出了另一个关于 Goroutines 如何出现内存泄露的情景。 ## 泄漏:被遗弃的接收者 ***在此内存...

  • 停止写破坏性(Broken) Go 库

    不久前我和朋友们想出一个主意,准备合并我们的 IRC bots,并用 Go 重写它们。为了防止重写大部分现有功能,我们试图找到支持 bots 程序中使用的 `Web API` 的现有库。我们的项目需要一个 Reddit API 的库。这篇文章启发于我找到的前三个库,我不打算说出它们的名字,以免羞辱它们的作者。 上面说的每一个库都存在一些基本问题以至于它们在真实场景中不可用。并且每个库都以这样一种方式编写:不以非向后兼容的方式修改现有库的 API,这样是不可能修复问题的。不幸的是,由于很多其...

  • 120
    Go: 并发访问 Map — Part III

    ![img](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-concurrency-access-with-maps-Part-III/1_uZMa7x3KBqJKJ6rWtnZFwA.png) 在上一篇文章 “[Go: 通过源码研究 Map 的设计](https://studygolang.com/articles/22777)” 中,我们讲述了 map 的内部实现。 [Go blog](ht...

  • 120
    Go: 通过代码学习 Map 的设计 — Part II

    ![img](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-map-design-by-code-part-II/1_Mr8IJbn7a8SV1FN-mN_KXg.png) 这篇文章是 "[Go: 通过例子学习 Map 的设计](https://studygolang.com/articles/22773)" 的下一篇,它从高层次上介绍了 map 的设计。为了理解下文讨论的概念,我强烈建议你从上一篇文...

  • 120
    Go: 通过例子学习 Map 的设计 — Part I

    ![img](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-map-design-by-example-part-I/1_HFwlzPXZ1nXxKMwumjrlmQ.png) 本文是三篇系列文章中的第一篇。每篇文章都将涵盖 map 的不同部分。我建议你按顺序阅读。 Go 提供的内置类型 `map` 是使用[哈希表](https://en.wikipedia.org/wiki/Hash_table) 实...

  • Go 最小硬件编程(第一部分)

    我们能够让 Go 在多低的配置下运行并做一些实用的事情呢? 最近我购买了这个特别便宜的开发板: [![STM32F030F4P6](https://ziutek.github.io/images/mcu/f030-demo-board/board.jpg)](https://ziutek.github.io/2018/03/30/go_on_very_small_hardware.html) 购买它,我基于以下三个理由:第一,我(作为一个程序员)从未搞过 STM32F0 系列的...

  • Golang <-time.After()在计时器过期前不会被垃圾回收

    最近我在调查 Go 应用程序中内存泄漏的问题,这个问题主要因为我没有正确的阅读文档。这是一段导致消耗了多个 Gbs 内存的代码: ```go func ProcessChannelMessages(ctx context.Context, in <-chan string, idleCounter prometheus.Counter) { for { start := time.Now() select { case s, ok := <-in: if !...

  • Go 实现百万 WebSocket 连接

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/a-million-websocket-and-go/image_1.jpeg) 大家好!我是 Sergey Kamardin,是 Mail.Ru 的一名工程师。 本文主要介绍如何使用 Go 开发高负载的 WebSocket 服务。 如果你熟悉 WebSockets,但对 Go 了解不多,仍希望你对这篇文章的想法和性能优化方面感兴趣。 ...

  • 使用 Go 和 ReactJS 构建聊天系统(六):Docker 部署

    本节完整代码:[GitHub](https://github.com/watermelo/realtime-chat-go-react/tree/part-6) > 本文是关于使用 ReactJS 和 Go 构建聊天应用程序的系列文章的第 6 部分。你可以在这里找到第 5 部分 - [优化前端](https://studygolang.com/articles/22433) 在本节中,我们将专注于将 Docker 添加到后端应用程序中。 为什么要这么做呢?在我们研究诸如身份验证...

  • 使用 Go 和 ReactJS 构建聊天系统(五):优化前端

    本节完整代码:[GitHub](https://github.com/watermelo/realtime-chat-go-react/tree/part-5) > 本文是关于使用 ReactJS 和 Go 构建聊天应用程序的系列文章的第 5 部分。你可以在这里找到第 4 部分 - [处理多个客户端](https://studygolang.com/articles/22430) 欢迎来到本系列的第 5 部分!如果你已经学到这儿了,那么我希望你享受学习 Go 的乐趣并运用 Go 和...

  • 使用 Go 和 ReactJS 构建聊天系统(四):处理多客户端

    本节完整代码:[GitHub](https://github.com/watermelo/realtime-chat-go-react/tree/part-4) > 本文是关于使用 ReactJS 和 Go 构建聊天应用程序的系列文章的第 4 部分。你可以在这里找到第 3 部分 - [前端实现](https://studygolang.com/articles/22429) 这节主要实现处理多个客户端消息的功能,并将收到的消息广播到每个连接的客户端。在本系列的这一部分结束时,我们将:...

  • 使用 Go 和 ReactJS 构建聊天系统(三):前端实现

    本节完整代码:[GitHub](https://github.com/watermelo/realtime-chat-go-react/tree/part-3) > 本文是关于使用 ReactJS 和 Go 构建聊天应用程序的系列文章的第 3 部分。你可以在这里找到第 2 部分 - [后端实现](https://studygolang.com/articles/22426) ## Header 组件 我们先来创建一个非常简单的 Header 组件。我们需要在 `frontend...

  • 使用 Go 和 ReactJS 构建聊天系统(二):gorilla/websocket 包提供的 WebSockets

    本节完整代码:[GitHub](https://github.com/watermelo/realtime-chat-go-react/tree/part-1-and-2) > 本文是使用 ReactJS 和 Go 来构建聊天应用程序的系列文章的第 2 部分。你可以在这里找到第 1 部分 - [初始化设置](https://studygolang.com/articles/22423) 现在我们已经建立好了基本的前端和后端,现在需要来完善一些功能了。 在本节中,我们将实现一个基...

  • 使用 Go 和 ReactJS 构建聊天系统(一):初始化项目

    本节完整代码:[GitHub](https://github.com/watermelo/realtime-chat-go-react/tree/part-1-and-2) 我们将通过设置两个项目来开始这个课程。一旦我们完成了枯燥的设置,就可以开始添加新功能并构建我们的应用程序,将看到一些积极的结果! ## 目标 在这部分课程结束后,你将掌握: - 在 `backend/` 目录创建基本的 Go 应用 - 在 `frontend/` 目录创建基本的 ReactJS 应用...

  • 使用 Go 和 ReactJS 构建聊天系统(前言)

    本节完整代码:[GitHub](https://github.com/watermelo/realtime-chat-go-react/tree/master) ## 课程目标 在这个项目中,我们将考虑使用 Go 作为后端,React.JS 作为前端来构建一个聊天系统。 本课程将有助于你巩固 Go 的并发概念和技术,提供开发更复杂的 Go 应用程序的实际经验,希望你能够轻松编写常用的 Go 程序。 ## 目的 我们将逐步构建这个聊天系统,以确保整个课程的学习保持轻松...

  • Go 切片是胖指针

    *本文的内容曾在 [Hacker News](https://news.ycombinator.com/item?id=20321116) 上进行讨论。* 使用 C 语言时,常见的一个难题就是要理解指针除了表示一个内存地址以外什么都不是。一个传入了指针的被调函数只知道这个指针指向什么类型的对象——也许包含了内存对齐和指针可以被如何使用之类的信息。如果这是一个指向 void 的指针(即 `void *`),那么就连这类信息也是无法获知的。 指针指向多少个连续的元素也是无法获知的。可能是...

  • 在 Go 中的 ORM 和查询构建

    2019.07.13 星期六 发表于 [Programming](https://andrewpillar.com/programming/) 最近,我一直在研究 Go 中与数据库交互的各种解决方案。在 Go 中与数据库交互我使用的底层库是 sqlx。你只需要写出 SQL,并使用 db tag 标记结构,之后让 sqlx 处理其余工作。但是,我遇到的主要问题是符合语法习惯的查询构建。这让我调查了这个问题,并在本文中记下了一些想法。 在 Go 中,第一类函数是进行 SQL 查询构建的惯...

  • Go语言中的微服务

    # Go语言中的微服务 ## 摘要 我最近在墨尔本 Golang 聚会上就如何开发微服务和框架做了一次演讲。在本文中,我将与您分享我的想法(此外,它对我来说是一个很好的复习)。 在这里,我要介绍以下框架: * [Go Micro](https://micro.mu/) * [Go Kit](https://gokit.io/) * [Gizmo](https://github.com/NYTimes/gizmo) * [Kite](https://github.co...

  • Go 的 Protocol Buffer 教程

    欢迎程序员们!在这个教程里面,我们将学习如何在你的 Go 应用中使 protocol Buffers 数据格式。我们将详细讲述这种数据格式,以及为什么这种数据格式优于传统的数据格式,例如 XML 甚至 JSON。在我们写更多复杂的例子之前,我们将从一个简单的例子开始编写运行。 在这个教程的最后,你会对 protoco Buffe 有一个基础的了解,并且你将可以顺利的写出更好的系统。 ## 视频教程 https://www.youtube.com/embed/NoDRq6Twkt...

  • Go 语言是 Google 的语言,不是我们的

    > GCTT 观点:有一个组织把控 Go 的发展方向,这其实一定程度上是一件好事,否则 Go 不知道又发展成什么了。 在 Twitter 上,我看到了[下面的问题](https://twitter.com/kapoorsunny/status/1130150301468700674)([via](https://old.reddit.com/r/golang/comments/bqiyyb/generics_in_go/)): > 在 Go 话题下有很多人在讨论泛型,为什么我们不能拥...

  • 为什么 Go 适合微服务

    ![Go Crew at SafetyCulture](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-is-good-microservice/1_K95qdWukzkEadEpxqiNdEQ.jpeg) 去年早些时候,我们决定改用 Go(Golang) 作为我们([SafetyCulture](https://safetyculture.com/))开发微服务的选择。在这之前,我们的微服务使用 No...

  • 如何处理 Go 语言中的错误

    ## 精通 Go 语言实用错误处理方式 ![images](https://raw.githubusercontent.com/studygolang/gctt-images/master/error-handling-in-go/1_BmEMrWVjQVUs5bwWTn_AIg.png) *这篇文章是[“在你进入到 Go 语言的世界之前”](https://medium.com/gett-engineering/before-you-go-go-bf4f861cdec7) 系列中的...

  • Go 内存管理之二

    ## 概述 之前在 [povilasv.me](https://povilasv.me/) 上,我们一起探讨了 [GO 内存管理](https://povilasv.me/go-memory-management/) [GCTT 译文](https://studygolang.com/articles/14956),并且留下了两个小的 Go 程序,它们运行时分配的虚拟内存大小显著不同。 首先,我们一起来看一下占用很多虚拟内存的程序 `ex1`。它的代码如下: ```go fu...

  • 你真的需要微服务吗

    ## 前言 我们已经[设计和构建](https://www.browserlondon.com/services/design-development/) 了十多年的软件,大部分时间我们一直在使用优秀的 Symfony 框架来实现这一目标。 Symfony 是一个传统的单体 PHP 构件集,受 Java Spring 的启发,我们发现它非常适合[企业 Web 应用程序](https://www.browserlondon.com/case-study/insights/) 和[数字产品](...

  • 致 Go 团队的一封公开信 —— 关于 try

    > polaris 注:目前关于 try 的提案被否决了,具体见:https://studygolang.com/articles/22043 *“一旦语言变得足够复杂,在其中编程更像是从无限多的特性海洋中划出一个子集,其中大部分都是我们永远不会学到的。一旦语言像是有无限多的特性,为其添加更多特性的成本就不再明显。”* - *[Mark Miler](https://medium.com/@erights/the-tragedy-of-the-common-lisp-why-large-l...

  • 使用 CGO 和 GoReleaser 进行跨平台编译

    我参与了一个开源项目 [Mailchain](https://github.com/mailchain/mailchain) ,该项目使用 Go 语言。我想使用 `CI\CD` 轻松的创建版本。 Golang 是一种允许以简单的方式编译代码,并在不同的操作系统上执行的语言。我发现了一个很棒的工具 [https://goreleaser.com/](https://goreleaser.com/) ,它可以用来构建,打包和发布二进制文件。 这是在 Mac 上构建的命令。 ```bash...

  • 120
    我是如何在大型代码库上使用 pprof 探索 Go 中的内存泄漏

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/how-i-investigated-memory-leaks-in-go-using-pprof-on-a-large-codebase/pprof_6.png) 在今年的大部分时间里,我一直在 Orbs 团队用 Go 语言做可扩展的区块链的基础设施开发,这是令人兴奋的一年。在 2018 年的时候,我们研究我们的区块链该选择哪种语言实现。因为我们知道 ...

  • goroutine 可能使程序变慢

    ## 如何使用 goroutine 才能使你的 CPU 满负载运行呢 下面,我们将会展示一个关于 for 循环的代码,将输入分成几个序列添加到 Goroutines 里面!我敢打赌你之前可能有过几次这种情况,但是每次引入 gorountine 都让你的代码变得更快吗? 下面是一个简单的循环示例,它似乎很容易变成并发代码,但正如我们将看到的,并发版本不仅不会更快,实际上需要花费两倍的时间。 ## 串行循环,我们以一个把索引相加的简单的串行循环作为示例 ```go // S...

  • 120
    Go:我应该用指针替代结构体的副本吗?

    ![logo](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-should-i-use-a-pointer-instead-of-a-copy-of-my-struct-44b43b104963/1_IO4bo74w6aX7rKC_spjmvw.png) 对于许多 `golang` 开发者来说,考虑到性能,最佳实践是系统地使用指针而非结构体副本。 我们将回顾两个用例,来理解使用指针而非结构体副本...

  • 120
    使用 Go 实现简单的事件总线

    ![pic_1](https://raw.githubusercontent.com/studygolang/gctt-images/master/let%E2%80%99s-write-a-simple-event-bus-in-go/pic_1.png) 事件驱动架构是计算机科学中一种高度可扩展的范例。它允许我们可以多方系统异步处理事件。 事件总线是[发布/订阅模式](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_...

  • Go 语言中的集成测试:第一部分 - 用 Docker 执行测试

    ## 简介 > “测试会带来失败,而失败会带来理解。” —— Burt Rutan Burt Rutan 是一名航空航天工程师,他设计了 Voyager,这是第一架在不停车或加油的情况下环球飞行的飞机。虽然 Rutan 不是软件工程师,但他的话充分说明了测试的重要性,甚至是软件测试。所有形式的软件测试都非常重要,无论是单元、集成、系统还是验收测试。但是,根据项目的不同,一种形式的测试可能比其他形式更有价值。换句话说,有时一种形式的测试可以比其他形式更好地反映软件的健康和完整性。 ...