GCTT - Go 中文翻译组

收录了 543 篇文章 · 390 人关注

  • Go 中的任务队列

    在 [RapidLoop](https://www.rapidloop.com/) 中,我们几乎用 [Go](https://golang.org) 做所有事情,包括我们的服务器,应用服务和监控系统 [OpsDash](https://www.opsdash.com/)。 Go 十分擅长编写异步程序 - goroutine 和 channel 使用十分简单不容易出错并且和其他语言相比异步/等待模式,语法和功能都更加强大。请继续阅读来瞧瞧围绕任务队列的一些有趣的 Go 代码。 ## 不...

  • Go 语言神奇的 JSON

    今天我想和大家分享 Go 语言一些非常实用的技巧,用于编码和解码 JSON 文档。Go 语言的  `encoding/json` 包有一些有趣的特性,帮助我们轻松地解析 JSON 文档。你可以轻松地将大多数实际应用中的 JSON 转换为带有 Go 语言结构体标签的接口或者是 `Marshaler` 和 `Unmarshaler` 接口。 但有一个案例比较棘手:包含转义 JSON 元素的 JSON 文档。如下所示: ```json { "id": 12345, "name":...

  • 详解 Go 语言中的 time.Duration 类型

    长久以来,我一直抓狂于 Go 标准库中的 Time 包,我的抓狂来自于两个功能,一是捕获两个不同时间段之间间隔的毫秒数,二是将一个用毫秒表示的连续时间段与预先定义的时间段进行比较。这听起来很简单,没错,确实如此,但它的确让我抓狂了。 在 Time 包中,定义有一个名为 Duration 的类型和一些辅助的常量: ```go type Duration int64 const ( Nanosecond Duration = 1 Microsecond = 1000 * ...

  • Golang 之于 DevOps 开发的利与弊(六部曲之五):跨平台编译

    在这系列的第五篇文章,我们将讨论 Go 项目的跨平台编译. 在阅读这篇文章之前,请确保你已经阅读了[上一篇](https://studygolang.com/articles/12615)关于“Time包以及重载”的文章,或者订阅我们的博客更新提醒来获取此六部曲后续文章的音讯。 - [Golang 之于 DevOps 开发的利与弊(六部曲之一):Goroutines, Channels, Panics, 和 Errors](https://studygolang.com/articl...

  • 120
    Golang 之于 DevOps 开发的利与弊(六部曲之四):time 包和方法重载

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go_devops/golang-pros-cons-4-time-package-method-overloading.png) 万众期待的 Golang 之于 DevOps 开发的利与弊 系列终于回归了!在这篇文章,我们讨论下 Golang 中的 time 包,以及 go 语言中为什么不使用方法重载。 如果你没有读 [最近一篇](https:/...

  • Golang 之于 DevOps 开发的利与弊(六部曲之三):速度 vs. 缺少泛型

    这是我们关于 DevOps 开发流程之中使用 Golang 之利与弊的六部曲系列。在这篇文章里,我们会讨论 Golang 的运行时/编译/维护的速度(好的方面);以及缺少泛型(缺点)。 在阅读这篇文章之前,请确保你已经阅读了[上一篇](https://studygolang.com/articles/12608)关于“接口实现以及公有/私有命名方式”,或者[订阅](http://eepurl.com/cOHJ3f)我们的博客更新提醒来获取此六部曲后续文章的音讯。(我们会隔周更新,但是鉴于我...

  • Golang 之于 DevOps 开发的利与弊(六部曲之二):接口实现的自动化和公有/私有实现

    在这系列的第二篇文章,我们讨论接口实现(优势)和公共/私有设计(一个明显的劣势)。 如果你错过了上一篇关于 goroutines 和 panics/error 的文章,请务必将它补上。你也可以订阅我们的博客,以及时获得更新状况通知。(大概隔周更新一次) - [Golang 之于 DevOps 开发者的利与弊#1:Goroutines,Channels,Panics和Errors](https://blog.bluematador.com/blog/posts/golang-pros-...

  • For Range 的语义

    ## 前言 为了更好地理解本文中提及的内容,这些是需要首先阅读的好文章: 下面列出 4 篇文章的索引: - 1. [Go 语言机制之栈和指针](https://studygolang.com/articles/12443) - 2. [Go 语言机制之逃逸分析](https://studygolang.com/articles/12444) - 3. [Go 语言机制之内存剖析](https://studygolang.com/articles/12445) - 4. [Go...

  • Go test 少为人知的特性

    大多数的 Go 程序员都知道和喜欢用 `go test`,这个测试工具来自于 Go 官方的 `gc` 工具链。(想要执行测试代码)这个命令可能是最简单的了,而且还能做得很漂亮。 大家都知道,运行 `go test` 命令将执行当前目录下的包的测试代码,它会寻找 `*_test.go` 文件,并在这些文件中,寻找符合 `TestXxx(*testing.T){}` 命名的函数和参数(即,接收 `*testing.T` 参数的函数,命名为 `TestXxx`,`Xxx` 可以是任何不以小写字符...

  • 你的 pprof 暴露了

    IPv4 扫描暴露出的 `net/http/pprof` 端点(endpoint) 原文发表日期: 2017/9/27 Go语言的 [net/http/pprof](https://golang.org/pkg/net/http/pprof/) 包是令人难以置信的强大的,调试正在运行的生产服务器的这个功能微不足道,而在这个调试过程,就很容易不经意间将调试信息暴露给世界。在这篇文章中,我们用 [zmap project](https://github.com/zmap) 作为例子,展示...

  • 120
    你所不知道的 Go 语言的一些令人惊叹的优点

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-advantage/1.png) > 插图来自 https://github.com/ashleymcnamara/gophers 在这篇文章中,我将会讨论为什么你应该尝试下 Go 语言,并且应该从哪里开始下手。 Golang 是一种编程语言,在过去的几年中你可能听说过很多。尽管是在 2009 年创建的,但是近年来才开始流行。 ![]...

  • 一名 Node.js 工程师的 Go 学习之旅

    GERGELY NEMETH 2018-02-08 近几年, Kubernetes 一直是容器编排和管理平台的首选。对于我来说,也很想搞清楚它的底层是如何工作的,所以我决定来学一学 Go 这门语言。 在这边文章中,我会基于我的经验,并从一个 Node.js 工程师的视角出发。因此我会特别关注: - 依赖管理 - 如何处理异步操作 那就让我们开始吧 :) ## 什么是 Go ? > Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易. - g...

  • 实现一个 Golang 调试器(第一部分)

    写这个系列的目的不是为了列出 Golang 编程语言的调试器的所有特性。如果你想看这些内容,可以看下 [Delve](https://github.com/derekparker/delve)。在这篇文章里我们试着去探索下调试器通常是怎样工作的,怎么在 Linux 上完成一个基本的调试,Linux 上比较关心 Golang 的功能,比如 [goroutine](https://golang.org/ref/spec#Go_statements) 。 创建调试器没那么简单。就这一个话题我们单...

  • 120
    对 Go 中长时间运行 io.Reader 和 io.Writer 的操作测算进度和估算剩余时间

    ![img](https://raw.githubusercontent.com/studygolang/gctt-images/master/reader-writer/1_YfQ0FQIK4l6NMW3wsl9NNw.jpeg) 每当我们在使用类似 io.Copy 和 ioutil.ReadAll 的工具时,比如我们正在从 http.Response 主体读入或者上传一个文件,我们会发现这些方法将一直堵塞,直到整个过程完成,哪怕耗时数十分钟甚至是小时——而且我们没有办法来查看进度,以及...

  • 关于在 Go 代码中使用退避方法,啰嗦几句(Yak Shaving With Backoff Libraries in Go)

    我相信你有过调用 API 接口需要使用退避算法的时候。在 Go 语言现有技术中,有 [github.com/cenkalti/backoff](https://github.com/cenkalti/backoff),[github.com/jpillora/backoff](https://github.com/jpillora/backoff),和其它库可以使用。 我曾经使用过 [github.com/cenkalti/backoff](https://github.com/cenka...

  • 使用 Golang 构建整洁架构

    ## 什么是整洁架构? 在《Clean Architecture: A Craftsman’s Guide to Software Structure and Design》一书中,著名作家 Robert “Uncle Bob” Martin 提出了一种具有一些重要特性的体系结构,如框架、数据库和接口的可测试性和独立性。 整洁架构的约束条件是: * 独立的框架。该体系结构并不依赖于某些带有特性的软件库的存在。这允许您使用这些框架作为工具,而不是将您的系统束缚在有限的约束中。 ...

  • goroutine 和 channel 不可滥用

    我以前觉得使用 goroutine 和 channel 的性能开销是基本忽略不计的--尤其是和 IO 的性能开销相比--但是最近我做了一个实验,实际验证了下。 我在给[我的课程项目](https://bradfieldcs.com/courses/databases/)做一个[玩具相关的数据库](https://github.com/robot-dreams/zdb2)。一开始,我从 CSV 文件里加载数据表,后来我需要添加一个二进制的表格结构。不幸的是,第一次尝试(加载二进制表格)的效果...

  • Go 反射:根据类型创建对象-第二部分(复合类型)

    > 这是关于 Golang 中根据类型创建对象系列博客的第二篇,讨论的是创建复合对象。第一篇在[这里](https://studygolang.com/articles/12434) ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-reflect/cover1.png) 在前一篇博客中,我解释了 go reflect 包 `type` 和 `kind` 的概念。这篇博客,我将深入探讨这些术...

  • Go1.10 支持 HTTPS 代理

    Go1.9 出来后 6 个多月的时间,Go1.10 就被[发布](https://blog.golang.org/go1.10)。新版本带来大大小小的变化([发行说明](https://golang.org/doc/go1.10)),但是我想谈谈有关 `net/http` 包的改变。1.10 版本支持在 HTTPS([commit](https://github.com/hyangah/go/commit/ab0372d91c17ca97a8258670beadadc6601d0da2)) 上的...

  • 曾经的 Go 程序员又回来了(The Gopher There and Back Again)

    按照惯例,第一篇博文总要说点历史,对吧?我作为软件开发人员,主要还是使用 PHP 语言。第一次接触它还是我在高中的时候,跟一个朋友一起开发一个项目。我们想为项目建一个网站,正好发现一个用 PHP 语言,代码写得非常整齐,并且预打包的解决方案。那个时候,我完全不懂这些代码是干嘛的,也没有花时间去弄懂它。多年之后,我再次与 PHP 相遇。在我进入大学的前 6 个月(我想大约 7 年前),PHP 成了我主要关注的语言之一。两年前,我第一次经人介绍了解到 Go 语言。 我大部分专业经历都来自于位于...

  • 120
    Goroutine 泄露

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/goroutine-leak/cover.jpg) Go 中的并发性是以 goroutine(独立活动)和 channel(用于通信)的形式实现的。处理 goroutine 时,程序员需要小心翼翼地避免泄露。如果最终永远堵塞在 I/O 上(例如 channel 通信),或者陷入死循环,那么 goroutine 会发生泄露。即使是阻塞的 goroutine...

  • 在 Go 中实现 tail 的跟踪功能

    tail 是我们大多数人都熟悉的命令。我假设你也熟悉提供的 `-f` 选项。如果你不熟悉,知道它会打印出文件的最后几行即可。最近在一个项目上工作,我想知道我需要做什么来实现这个功能。这个想法来自阅读 [Feynman](http://amzn.to/2AIWVuX) 的书: > 毫无疑问,你知道如何去做; 但是当你像小孩子一样玩这类问题,并且你没有看到答案时...试图找出如何去做是很有趣的。然后,当你进入成年时,你会培养出一定的自信,你可以去发现事物; 但是如果他们已经被发现,那你根本不应...

  • Golang 下的微服务 - 第 5 部分 - Go Micro 的事件代理

    在本系列的[前一部分中](https://studygolang.com/articles/12485),我们谈到了用户认证和 JWT。在这一部分中,我们将快速浏览 go-micro 的代理功能。 正如前面的文章提到的,go-micro 是一个可插拔的框架,它连接了许多不同的常用技术。如果你看看[插件仓库](https://github.com/micro/go-plugins),你会看到它支持多少插件。 在我们的例子中,我们将使用 NATS 代理插件。 ## 基于事件驱动的架...

  • Go 语言机制之数据和语法的设计哲学(Design Philosophy On Data And Semantics)

    ## 前序(Prelude) 本系列文章总共四篇,主要帮助大家理解 Go 语言中一些语法结构和其背后的设计原则,包括指针、栈、堆、逃逸分析和值或者指针传递。这是最后一篇,重点介绍在代码中使用值和指针的数据和语义的设计哲学。 以下是本系列文章的索引: 1. [Go 语言机制之栈与指针](https://studygolang.com/articles/12443) 2. [Go 语言机制之逃逸分析](https://studygolang.com/articles/12444) ...

  • Go 语言 Malloc 的惯用语法

    我终于又开始使用 Go 语言编程了。虽然我在前两年多的时间里积极参与这个项目,但从 2012 年起,我就基本没有参加过这个项目。最初,我之所以做出贡献,是因为我是贝尔实验室 [Plan 9](http://9p.io/plan9/)(操作系统) 和 [FreeBSD](https://www.freebsd.org/) 的粉丝。我喜欢可用的、基于 csp 的语言,但是 Go 最初的版本只能在 Linux 和 OS X 上运行。那时候我只有 FreeBSD 系统,因此,我将编译器工具链、运行时和标...

  • Golang 中的微服务-第 4 部分-使用 JWT 做认证

    在之前的文章里,我们创建了一个用户服务,保存了一些用户。现在我们看下如何在用户服务中安全的保存用户密码,同时,通过微服务写几个功能,来验证用户,发布安全令牌。 注意,我现在已经把我们的服务拆分到几个不同的仓库里。 我觉得这样部署起来容易些。 最开始我打算做成一个单独的仓库,但是发现用 Go 的 dep 管理有点麻烦,有很多冲突。我也会说明下如何独立地运行和测试微服务。 遗憾的是,用这种方法我们就不能用 docker-compose 了。 不过目前用起来还不错。如果你在这方面有什么建议...

  • 120
    优雅的处理错误,而不仅仅只是检查错误

    这篇文章摘取至我在日本东京举办的 [GoCon spring conference](https://gocon.connpass.com/event/27521/) 上的演讲稿。 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/error-handle/ba5a9ada.png) ## 错误只是一些值 我花了很多时间来思考如何在 Go 中处理错误是最好的。我真希望能有一种简单直接的方式来...

  • 120
    在 Linux 中使用 Go 作为脚本语言

    在 `Cloudflare` 的人们都非常喜欢 Go 语言。我们在许多[内部软件项目](https://blog.cloudflare.com/what-weve-been-doing-with-go/)以及更大的[管道系统](https://blog.cloudflare.com/meet-gatebot-a-bot-that-allows-us-to-sleep/)中使用它。但是,我们能否进入下一个层次并将其用作我们最喜欢的操作系统 Linux 的脚本语言呢? ![image here...

  • golang 中的微服务 - 第3部分 - docker compose 和 datastores

    在[之前的文章](https://studygolang.com/articles/12094)中,我们介绍了 [go-micro](https://github.com/micro/go-micro) 和 [Docker](https://www.docker.com/) 的一些基础知识。在推出了这两项服务之后我们将在本文介绍 [docker-compose](https://docs.docker.com/compose/)、教大家如何更便捷地在本地运行多个服务,还会列述一些在本系列微服务教...

  • Go 语言机制之内存剖析(Language Mechanics On Memory Profiling)

    ## 前序(Prelude) 本系列文章总共四篇,主要帮助大家理解 Go 语言中一些语法结构和其背后的设计原则,包括指针、栈、堆、逃逸分析和值/指针传递。这是第三篇,主要介绍堆和逃逸分析。(译者注:这一篇可看成第二篇的进阶版) 以下是本系列文章的索引: 1. [Go 语言机制之栈与指针](https://studygolang.com/articles/12443) 2. [Go 语言机制之逃逸分析](https://studygolang.com/articles/12444...

  • 120
    Go 语言机制之逃逸分析(Language Mechanics On Escape Analysis)

    ## 前序(Prelude) 本系列文章总共四篇,主要帮助大家理解 Go 语言中一些语法结构和其背后的设计原则,包括指针、栈、堆、逃逸分析和值/指针传递。这是第二篇,主要介绍堆和逃逸分析。 以下是本系列文章的索引: 1. [Go 语言机制之栈与指针](https://studygolang.com/articles/12443) 2. [Go 语言机制之逃逸分析](https://studygolang.com/articles/12444) 3. [Go 语言机制之内存剖析]...

  • 120
    Go 语言机制之栈和指针

    ## 前言 本系列文章总共包括 4 篇,主要帮助大家理解 Go 语言中一些语言机制和其背后的设计原则,包括指针、栈、堆、逃逸分析和值传递/地址传递。这一篇是本系列的第一篇,主要介绍栈和指针。 以下是本系列文章的索引: 1. [Go 语言机制之栈与指针](https://studygolang.com/articles/12443) 2. [Go 语言机制之逃逸分析](https://studygolang.com/articles/12444) 3. [Go 语言机制之内存剖析...

  • 120
    Go 反射:根据类型创建对象-第一部分(原始类型)

    > 这是关于在 Go 中根据类型创建对象的博客系列两部分的第一部分。这部分讨论原始类型的对象创建 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-reflect/cover1.png) Go 中的 reflect 包提供了根据执行过程中对象的类型来改变程序控制流的 API。 reflect 包提供了两个重要的结构 - Type 和 Value。 Type 是一个 G...

  • 为 Go Web-apps 编写 Dockerfiles 的终极指南

    你或许想在 Docker 中使用 Go,原因有: 1. 如果你想在 Kubernetes 上运行,打包为镜像是必须的(就像我一样) 2. 你不得不在同一台机器上运行不同的 Go 版本 3. 开发和生产都需要精确的、可复制的、可共享的和确定的环境 4. 你需要快速和简单的方式来构建和部署编译好的二进制文件 5. 你想快速开始(任何安装了 Docker 的人都可以直接开始编写代码而不需要设置其他依赖或 `GOPATH` 环境变量) 恭喜你,你来对地方了。 我们将逐步构建一个...

  • Go 语言的错误处理

    Go 语言的错误处理是基于明确的目的而设计的。你应该从函数中返回所有可能的错误,并且检查/处理这些返回值。和其他语言相比,这一点可能看起来有些繁琐和不人性化,其实并不是这样的。让我们来看看一些基本的例子,然后继续做一些较重要的事情。 ## Non 错误 实际上 Go 有个概念 non-error。这是一个语言特性,不能用在用户自定义函数中。最明显的例子就是从 map 中通过 key 获取值。 ```go if val, ok := data["key"]; ok { //...

  • 通过 go/parser 理解 Go

    这篇文章所讲内容和 [episode 25 of justforfunc](https://www.youtube.com/watch?v=YRWCa84pykM) 是相同的。 ## justforfunc 前情提要 我们在[上一篇文章](https://studygolang.com/articles/12324)中使用 `go/scanner` 找出了标准库中最常用的标识符。 > 这个标识符就是 v 为了能获取到更有价值的信息,我们只考虑大于等于三个字符的标识符。不出...

  • unsafe.Pointer 和系统调用

    按照 Go 语言官方文档所说, unsafe 是关注 Go 程序操作类型安全的包。 像包名暗示的一样,使用它要格外小心; unsafe 可以特别危险,但它也可以特别有效。例如,当处理系统调用时,Go 的结构体必须和 C 的结构体拥有相同的内存结构,这时你可能除了使用 unsafe 以外,别无选择。 unsafe.Pointer 可以让你无视 Go 的类型系统,完成任何类型与内建的 uintptr 类型之间的转化。根据文档,unsafe.Pointer 可以实现四种其他...

  • 选择一个 Go 框架

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/choose-framework/heading.jpg) 每一天,或者是每隔几天,总有人来到 [/r/golang](https://www.reddit.com/r/golang/) ,并询问些类似如下的问题“哪个框架是最好的?”。我认为我们应该尝试提出这个问题,至少以一种容易理解的方式提出。你不应该使用框架。 对于一个复杂的问题,这也许是一个...

  • 120
    Go vs Python:深入并发

    ## 介绍 在过去的几个月里,我在几个项目上使用过 Go,尽管我还算不上专家,但是还是有几件事我要感谢 Go:首先,它有一个清晰而简单的语法,我不止一次注意到 Github 开发人员的风格非常接近于旧 C 程序中使用的风格,从理论上讲,Go 似乎吸收了世界上所有语言最好的特性:它有着高级语言的力量,明确的规则使得更简单,即使这些特性有时有一点点的约束力--就是可以给代码强加一个坚实的逻辑。这是命令式的简单,由大小以位为单位的原始类型组成。但是没有像把字符串当成字符数组那样操作的乏味。然而,...

  • 120
    接受 interface 参数,返回 struct 在 go 中意味着什么

    ## 注意细节 在之前的文章中,我提到了一个关于 *accept interfaces, return structs* 的参考指南,在查看同事代码的时候经常会被问“为什么”。特别是这不是一个必须遵守的规则。这个想法的关键点以及理解什么时候妥协,在于维护项目灵活性和避免抢占抽象(译者注:“Preemptive abstractions” 并发系统中连续组件的轻量级验证方案的一种抽象技术)之间的平衡。 ![c90d04d0.png](https://raw.githubusercont...

  • Go 逃逸分析的缺陷

    ## 序 先阅读这个由四部分组成的系列文章,对理解逃逸分析和数据语义会有帮助。下面详细介绍了阅读逃逸分析报告和 pprof 输出的方法。(GCTT 已经在翻译中) <https://www.ardanlabs.com/blog/2017/05/language-mechanics-on-stacks-and-pointers.html> ## 介绍 即使使用了 Go 4 年,我仍然会被这门语言震惊到。多亏了编译器执行的静态代码分析,编译器可以对其生成的代码进行一些有趣的优...

  • Go 语言的缓冲通道:提示和技巧

    Mahadevan Ramachandran • January 15 通道和 goroutine 是 Go 语言基于 CSP( communicating sequential processes ,通信顺序进程)并发机制的核心部分。阅读本文可以学到一些关于channel的提示和技巧,尤其是“缓冲” channel ,在 “生产者-消费者” 情境中广泛使用了缓冲通道作为队列。 ## 缓冲通道 = 队列 缓冲通道是固定容量的先进先出(FIFO)队列。容量在队列创建的时候就已经固...

  • 在 Go 中使用命名返回变量捕获 panic

    这将是一个简短的帖子,灵感来源于 Sean Kelly 十一月份的推特。 > 我发现了一个在 golang 中使用指定的返回值的原因并且现在我感到潸然泪下。 >                     — Sean Kelly (@StabbyCutyou) 2017年11月15日 其目标是为了记录并说明一种有必要使用到命名返回变量的情况,所以说让我们进入正题。 想象你正在编写一些用了可能 panic 的函数的代码,并且无论什么原因(第三方库,向后兼容,等等)你都不能改...

  • Go 语言中的可赋值性(Assignability in Go)

    Go 是静态类型的编程语言。存储到变量中的值必须与变量的类型匹配。因此,不能像 Python 这种动态类型语言一样,随意的数据都可以作为值赋给变量。这个决定什么是允许赋值的规则就叫做可赋值性(Assignability)。 左边类型为 T 的变量,存在 6 种可以将右边的值赋给左边的情况。 ## 1. 相同类型(Identical types) 第一种是非常明显的。如果右边的类型(也)是 T,则赋值是完全可以的。更多的细节可以参考 ["Identical types in Go"](htt...

  • 在 Golang 中针对 int64 类型优化 abs()

    Go 语言没有内置 `abs()` 标准函数来计算整数的绝对值,这里的绝对值是指负数、正数的非负表示。 我最近为了解决 [Advent of Code 2017](http://adventofcode.com/2017/about) 上边的 [Day 20](http://adventofcode.com/2017/day/20) 难题,自己实现了一个 `abs()` 函数。如果你想学点新东西或试试身手,可以去一探究竟。 Go 实际上已经在 `math` 包中实现了 `abs()`...

  • 使用 SwaggerUI 创建 Golang API 文档

    为你的 API 提供一个文档比你想象中更加有用,即使你没有公开你的 API ,为你的前端或者移动团队提供一个文档会比你提供截图/片段或使用 Postman/Insomnia (带有同步的高级版本)等付费产品更容易。借助 SwaggerUI ,您可以自动获得所有 API 的设计良好的文档。当切换到 Go 时,由于缺少文档/教程,我在配置它的时候出现了一些问题,所以我决定写一个。 ![goswagger](https://raw.githubusercontent.com/studygolang/...

  • 如何只通过 Go 语言标准库创建 RESTful 接口

    瑞安·麦丘 2017 年 12 月 9 日 Go 是一门相当新的语言,并且在最近几年得到了越来越多的关注。它的功能非常强大,而且拥有出色的工具来设计快速高效的 API 接口。虽然已经有很多库可以创建一个 API 接口,像 [Go Buffalo](https://gobuffalo.io/) 和 [Goa](https://goa.design/) 之类;但是,如果能够做到除了数据库和缓存连接器之外,仅仅使用标准库来创建,无疑将非常有趣。 在这篇博客中,我将分析如何使用 Go 语言标...

  • 使用 Go 语言完成 HTTP 文件上传与下载

    最近我使用 Go 语言完成了一个正式的 web 应用,有一些方面的问题在使用 Go 开发 web 应用过程中比较重要。过去,我将 web 开发作为一项职业并且把使用不同的语言和范式开发 web 应用作为一项爱好,因此对于 web 开发领域有一些心得体会。 总的来说,我喜欢使用 Go 语言进行 web 开发,尽管开始一段时间需要去适应它。Go 语言有一些坑,但是正如本篇文章中所要讨论的文件上传与下载,Go 语言的标准库与内置函数,使得开发是种愉快的体验。 在接下来的几篇文章中,我将重点...

  • 120
    让我们用 Go 语言创建一个 NTP 客户端

    在网络编程做了一些研究之后,我邂逅了一篇题目为《Let's Make a NTP Client in C》,由 David Lettier(Lettier) 编写的文章。这篇文章鼓舞了我用 Go 去做相似的事。 > 这篇博文提到的代码都在这里 [https://github.com/vladimirvivien/go-ntp-client](https://github.com/vladimirvivien/go-ntp-client)。 这篇博文描述了一个(真正的) NTP 客户端...

  • 120
    Go 函数 -- Go 语言新手的带图教程

    简单易懂的 Go 函数带图教程 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-funcs/funcs.png) **注意:**该教程仅介绍 Go 函数,不包括:可变参数、延迟函数、外部函数、方法、HTTP、封包编码等。 * * * ### 什么是函数? 函数是一个独立的,可以被重用的,可以一次又一次运行的代码块。函数可以有输入参数,也可以有返回值输出。 ### 为...