GCTT - Go 中文翻译组

收录了 370 篇文章 · 288 人关注

  • 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 不是软件工程师,但他的话充分说明了测试的重要性,甚至是软件测试。所有形式的软件测试都非常重要,无论是单元、集成、系统还是验收测试。但是,根据项目的不同,一种形式的测试可能比其他形式更有价值。换句话说,有时一种形式的测试可以比其他形式更好地反映软件的健康和完整性。 ...

  • Go 高并发模式:第二部分(计时器)

    正如我在[上一篇文章](https://studygolang.com/articles/19394) 中所述,准确使用计时器很难的,所以这里进行一些说明。 ## 前言 如果你认为结合 Goroutines 去处理时间和计数器很简单的话,那你就错了,这里有提到的一些与 time.Timer 相关的问题或 bug: * [time: Timer.Reset is not possible to use correctly #14038](https://github.com/go...

  • 120
    Go: 什么是 unsafe 包

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/what-is-the-unsafe-package/unsafe_1.png) ℹ️本文基于 Go 1.12。 看到 unsafe 这个名称,我们应该尽量避免使用它。想要知道使用 unsafe 包可能产生不安全的原因,我们首先来看看官方文档的描述: > unsafe 包含有违背 Go 类型安全的操作。 > > 导入 unsafe 包可能...

  • Go 垃圾回收:第二部分 - GC 追踪

    ## 前言 这是三篇系列文章中的第二篇,该系列文章将会提供一个对 Go 垃圾回收器背后的机制和概念的理解。本篇主要介绍如何生成 GC 追踪并解释它们。 三篇系列文章的索引: 1)[Go 垃圾回收:第一部分 - 概念](https://studygolang.com/articles/21569) 2)[Go 垃圾回收:第二部分 - GC 追踪](https://studygolang.com/articles/21570) 3)即将发布 ## 介绍 在第...

  • Go 中的垃圾回收:第一部分 - 基础

    这是三篇系列文章的第一篇博文,系列文章提供了 Go 中垃圾回收背后的机制和概念的理解。这篇博文主要介绍回收器的基础概念。 三篇系列文章的索引: 1) [Go 中的垃圾回收:第一部分 - 概念](https://studygolang.com/articles/21569) 2) [Go 中的垃圾回收:第二部分 -GC 追踪](https://studygolang.com/articles/21570) 3) 即将诞生 ## 简介 垃圾回收器负责跟踪堆内存分配,释放无...

  • 120
    Go: 理解 Sync.Pool 的设计

    ![sync pool](https://raw.githubusercontent.com/studygolang/gctt-images/master/understand-the-design-of-sync-pool/3.jpg) ℹ️本文基于 Go 1.12 和 1.13 版本,并解释了这两个版本之间 sync/pool.go 的演变。 `sync` 包提供了一个强大且可复用的实例池,以减少 GC 压力。在使用该包之前,我们需要在使用池之前和之后对应用程序进行基准测试。这非...

  • Go 中的请求处理概述

    使用 Go 处理 HTTP 请求主要涉及两件事:ServeMuxes 和 Handlers。 [ServeMux](https://docs.studygolang.com/pkg/net/http/#ServeMux) 本质上是一个 HTTP 请求路由器(或多路复用器)。它将传入的请求与预定义的 URL 路径列表进行比较,并在找到匹配时调用路径的关联 handler。 handler 负责写入响应头和响应体。几乎任何对象都可以是 handler,只要它满足[http.Handler...

  • 用 Go 语言构建 SQL 解析器

    ## 摘要 本文旨在对如何用 Go 语言构建 [LL(1) 文法的解析器](https://en.wikipedia.org/wiki/LL_parser) ——此例用来解析 SQL 请求——作出简要的介绍。只需要读者具有极少的编程能力(函数、结构体、条件语句和 for 循环)。 如果你想直接跳过文章直接看结果,这里是完成后的解析器代码仓库: <https://github.com/marianogappa/sqlparser> ## 为了简化而放弃的内容 我们不会...

  • Let US sort

    ## 在这篇文章里,我尝试发掘 [Go](https://golang.org/) 语言的所有特性,以便用最优的、利用多核处理器的方式来实现 [归并排序](https://en.wikipedia.org/wiki/Merge_sort)。 时间复杂度为 `O(nlogn)` 的最优排序算法中,归并排序是其中之一。它的原理为将数组分为两部分,分别进行排序,最后再归并,这种做法的开销没那么大。 ![红色表示分割和排序,绿色表示归并](https://raw.githubusercont...

  • Golang Module Vs Dep: 支持 & 反对

    ![img](https://raw.githubusercontent.com/studygolang/gctt-images/master/vgo-module/vgo-modules-dependency-management-golang-blog-hero-1200x630.png) Go 语言有着一个热情的社区。尤其是当涉及推动语言本身及其生态的进步时,这种热情催生出精彩的讨论和许多很棒的想法,但是在前进的方向上发生分歧时,热情也会使社区分裂。比如,关于版本和依赖管理,在今年早...

  • 并发陷阱 2: 未完成的工作

    Jacob Walker 2019 年 4 月 18 日 ## 介绍 在我的第一篇文章 [Goroutine 泄露](https://studygolang.com/articles/17364) 中,我提到并发编程是一个很有用的工具,但是使用它也会带来某些非并发编程中不存在的陷阱。为了继续这个主题,我将介绍一个新的陷阱,这个陷阱叫做未完成的工作。当进程在非主协程的协程结束前终止时,这种陷阱就会发生。根据 Gorotine 的特性,强制关闭它将造成一个严重的问题。 ## 未完成...

  • 你为什么要喜欢 sync.Pool ?

    ## 介绍 因为它很快。通过文章底部存储库中的基准测试可以减少**4982 倍**的内存占用。 ![Comparing pool performance. Less than better.](https://raw.githubusercontent.com/studygolang/gctt-images/master/Why-you-should-like-sync.Pool/1.png) 相比之下, Pool 的性能更快更好。 ## Ok, 这究竟是怎么回事呢? ...

  • 如何使用 Go kit 工具包编写微服务

    我在互联网上搜索了很久关于使用 Go kit 工具包编写微服务的精品教程(我认为我的 Google-fu 相当不错),但是 我没有找到 ...... 来自[Go kit 代码库的示例](https://github.com/go-kit/kit/examples) 很好,但恕我直言,文档很枯燥。 然后我决定购买这本名为 `Go Programming Blueprints, 2nd Edition` 的书,这本书相当不错,但只有两章专门讨论 Go kit(一个用于实际开发微服务...

  • Docker 容器编排实践练习

    在本次练习中,你将体验到 Docker 的容器编排功能。首先你需要在单个主机上部署一个简单的应用程序,并了解其工作机制。然后,通过配置 Docker Swarm 模式,你将学习到怎样在多个主机上部署相同的简单应用程序。最后,你将看到如何对应用的规模进行扩容、缩容,以及如何将工作负载在不同的主机之间转移。 (译者注:登录原网站可使用在线练习资源) > **难度**:入门级 > **时间**:约 30 分钟 **任务**: - [第一节 - 容器编排是什么](# 第一节:容器编排是什么 ) ...

  • 现代服务端技术栈介绍 —— Golang、Protobuf 和 gRPC

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/modern-server/1_W_1gSpbn79xtYZw9_TBGPA.jpg) 身边多了一些新的服务端程序员,这一次,一切都与谷歌有关。自从谷歌开始在他们的生产系统中使用 Go 语言以来,`go` 语言的流行度快速地提升。从微服务架构创立至今,人们一直在关注像 `gRPC`、`Protobuf` 这样的现代数据通信解决方案。在这篇文章中,我将分别...

  • 如何使用 Golang 处理 MySQL 的 binlog

    大家好,我是 Artem,一名 Golang 开发。我们的团队花费了大量时间训练 MySQL binlog。这里整合一些简单用法,不会放过任何隐藏的陷阱。示例代码将在最后显示。 每次从数据库查询的返回结果中拉取用户信息时,主项目中会有高负载模块。此时使用缓存是一个不错的建议,但是什么时候重置缓存呢?这需要由数据来决定更新时间。 MySQL 的主从复制是一个很棒的设计。而我们的守护进程可以视为一个通过 binlog 获取数据的 slave,binlog 设置成 row 格式。这样就能使...

  • Go 测试高级窍门和技巧

    2017 年 2 月 1 日 · 5 min 阅读 这篇文章基于我在 [维尔纽斯的 Golang 交流会](https://www.meetup.com/Vilnius-Golang/) 上的演讲。 我读了很多博客,看了很多演讲并把所有这些窍门和技巧都集中在一个地方。首先我想感谢那些提出这些想法并把它们分享到社区的人。我从下面的这些工作中借鉴了资料和示例: - [Andrew Gerrand - Testing Techniques](https://talks.golang....

  • 使用 Golang Goroutines 并发编程

    大家好!在这篇文章中,我们将介绍如何在基于 Go 语言的项目中使用***goroutines***,以及如何提升项目运行时的性能。 ## 视频教程 https://youtu.be/ARHXmR0_MGY ## 简介 如今,Go 是一种性能优良的程序设计语言,它拥有大量优秀的特性用于支持构建高性能的应用程序。它通过特有的***goroutines***和***channels***,重新定义了什么是构建高并发的项目。 使用***goroutines***可以快速地将...

  • 效仿 Golang 中的枚举类型

    在这篇博文中我们看到使用 `go generate` 和遍历抽象语法树来生成强大的枚举类型。 博文的结果是一个生成枚举类型的客户端。[全部代码](https://github.com/steinfletcher/gonum) 都可以在 Github 上面找到。 ## Go 惯用技巧 Go 并没有对枚举类型提供一流的支持。模拟枚举类型的一种方法是,将一系列相关的常量定义为一个新的类型。Iota 可用于预定义连续自增的整形常量。我们可以像下面这样定义一个 `Color` 类型。 ...