GCTT - Go 中文翻译组

收录了 384 篇文章 · 298 人关注

  • Go 语言中的动态 JSON

    Go 语言是静态类型语言,虽然它也可以表现出动态类型,但是使用一个嵌套的 `map[string]interface{}` 在那里乱叫会让代码变得特别丑。通过掌握语言的静态特性,我们可以做的更好。 通过同一通道交换多种信息的时候,我们经常需要 JSON 具有动态的,或者更合适的参数内容。首先,让我们来讨论一下消息封装(message envelopes),JSON 在这里看起来就像这样: ```json { "type": "this part tells you how...

  • 120
    在 Go 中如何串联 HTTP 处理程序

    你好,今天我想分享一下,在 `Go` 语言中串联 HTTP 处理器。 在使用 Go 之前, 我使用 Nodejs + [ExpressJS](http://expressjs.com/en/4x/api.html) 去编写 HTTP 服务器应用。 这个框架提供了很简单的方法去使用中间件和串联很多路由节点,因此,不必指定完整的路由路径来为其添加处理程序。 ![图1](https://raw.githubusercontent.com/studygolang/gctt-images/m...

  • 从零开始一步步构建运行在 Kubernetes 上的服务

    如果你用 Go 写过程序,就会发现用 Go 来写服务是很简单的事。比如说,只要几行代码就可以跑起来一个 HTTP 服务。但是如果我们想让服务在生产环境运行,我们还需要添加什么呢?本文将通过写一个能在 Kubernetes 上运行的服务的例子,来讨论上述问题。 文中所有的例子可以在 [这里(按标签分类)](https://github.com/rumyantseva/advent-2017/tree/all-steps) ,或者 [这里(按 commit 分类)](https://githu...

  • 120
    Go 语言中的包装一个微服务样板

    首先呢,祝大家新年快乐 :tada::tada::tada: 全年无 BUG! 应用的复杂性在很多方面都在增长,诸如可扩展性、开发、测试以及部署。在企业级开发中,那种老式的大型单一架构看起来已经过时了。在我工作的众多公司中,都希望系统是通过简单的插件组合在一起的方式构建的。这就是为什么许多数公司都基于微服务架构来开发他们的产品。目前有 Netflix(译者注:美国流媒体巨头、世界最大的收费视频网站)、PayPal、Amazon、eBay 以及 Twitter 等少数几家公司正在使用微服务。...

  • 120
    测试 Go 语言 Web 应用

    ![image](https://raw.githubusercontent.com/studygolang/gctt-images/master/testing-web-app/cover.jpg) 我利用闲暇的时间尝试着用 Go 来写一个网站小应用。在 Go 标准库中有一些非常棒的包可以在 Web 应用开发中使用并且我非常喜欢使用它们。实际上,在 Go 官方的 wiki 中有一个编写 Web 应用的小教程。但是,却没有提及如何用标准库去测试 Web 应用,而且也没有搜索到比较好的一个方...

  • 120
    Golang 中 defer 的五个坑 - 第二部分

    本文承接[第一部分](https://studygolang.com/articles/12061)的内容继续讲解 defer 的一些常见陷阱 ## 1——Z 到 A(译注:倒序) 当你第一次学习 Go 的时候可能会中招。 例子 ```go func main() { for i := 0; i < 4; i++ { defer fmt.Print(i) } } ``` 输出 Go 的运行时会将延迟执行的函数保存至一个栈中(译注:意...

  • Go 中的 5 种高级测试方法

    只要你写过 Go 程序,肯定已经知道 Go 语言内置了一个功能完备的测试库。在这篇文章中我们将列出几种能帮助你提高编写测试能力的策略。这些策略是我们在以往的编程经历中总结出的可以很好的节省你的时间和精力的经验。 ### 使用测试套件(test suites) 测试套件是本篇文章中最重要的策略。它是一种针对拥有多个实现的通用接口的测试,在下面的例子中,你们将看到我是如何将 `Thinger` 接口的不同实现传递进同一个测试函数,并且让他们测试通过。 ```go type Thi...

  • 在 golang 中如何调用私有函数(绑定隐藏的标识符)

    *2016 年 4 月 28 日* 名字在 golang 中的重要性和在其他任何一种语言是一样的。他们甚至含有语义的作用:在一个包的外部某个名字的可见性是由这个名字首字母是否是大写来决定的。 有时为了更好的组织代码或者在其他包使用某些隐藏的函数时需要克服这种限制。 在过去美好的日子,有 2 种实现方式,它们能绕过编译器的检查:不能引用未导出的名称 pkg.symbol : - 旧的方式,现在已经不再使用 - 汇编级隐式连接到所需符号,称为 assembly stub...

  • 获取 Goroutine ID

    ## Goroutine ID 真实存在吗? 当然存在。 Go 运行时一定有某种方法来跟踪 goroutine ID。 ## 那我该使用它们吗? 不该。 - 原因一:https://groups.google.com/forum/#!topic/golang-nuts/Nt0hVV_nqHE - 原因二:https://groups.google.com/forum/#!topic/golang-nuts/0HGyCOrhuuI - 原因三:http://...

  • 两个随机数函数的故事

    我经常有一些困惑,`crypto/rand` 包和 `math/rand` 包是如何关联的,或者它们是如何按照预期的方式(一起)工作的?这是其他人已经思考过的问题,还是仅仅我个人的突发奇想呢?终于有一天,我决定攻克这个问题,这篇博客就是这次努力的结果。 ## `math` 包 如果你曾经关注过 `math/rand` 包,你会同意它提供了相当易用的 API。我最喜欢的例子是 `func Intn(n int) int` 函数,它返回了一个你指定范围内的随机数。非常有用! 你也许...

  • Golang 中的微服务 - 第二部分 - Docker 和 go-micro

    ## 简介: Docker 和 go-micro **[在上篇文章中](https://studygolang.com/articles/12060)**,我们大致介绍了如何编写一个基于 `gRPC` 的微服务。在这个部分,我们将涵盖 `Docker` 服务的基础知识,我们也将使用 [go-micro](https://github.com/micro/go-micro) 更新我们的服务,并在文本末尾引入第二个服务。 ## Docker简介 随着云计算的到来和微服务的诞生,服务...

  • 120
    仅需简单 5 步,给你的 Golang 程序添加 GUI (使用 Electron )

    创建一个 Golang app 是一件简单又轻松的事情,但是有时候你想给你的应用锦上添花:创建一个 GUI! 在本篇文章中,我将通过使用 astilectron 工具中的 bootstrap 以及 bundler 给一个简单的 Golang 程序添加 GUI。 我们的带有 GUI 的 Golang app 能够打开一个文件夹并且展示其中的内容。 你可以在这里找到完成后的 [代码](https://github.com/asticode/go-astilectron-demo) ...

  • 120
    Go 中 defer 的 5 个坑 - 第一部分

    > 通过本节的学习以避免掉入基础的 defer 陷阱中 本文只适合想要进阶学习 Golang 的新手阅读,大牛请绕道。 ## #1 -- defer nil 函数 如果一个延迟函数被赋值为 `nil` , 运行时的 [`panic`](https://golang.org/ref/spec#Handling_panics) 异常会发生在外围函数执行结束后而不是 `defer` 的函数被调用的时候。 例子 ```go func() { var run func...

  • Golang 中的微服务 - 第一部分

    ## 介绍 Golang 中的微服务系列总计十部分,预计每周更新。本系列的解决方案采用了 protobuf 和 gRPC 作为底层传输协议。为什么采用这两个技术呢?我花了相当长的时间,才想出并决定采用这个方案。这个方案对开发者来说,非常清晰而简明。我也很乐意把自己在搭建、测试和部署端到端的微服务过程中的心得,分享给想接触这块的朋友们。 在这个教程中,我们将先接触几个基础的概念和术语,然后开始搭建第一个简单的微服务模型。 本系列中,我们将会创建以下服务: - 委托 - 存...

  • Upspin 中的错误处理 —— 来自 Rob Pike

    [Upspin](https://upspin.io/) 项目使用自定义的包 —— [upspin.io/errors](https://godoc.org/upspin.io/errors) —— 来表示系统内部出现的错误条件。这些错误满足标准的 Go [error](https://golang.org/pkg/builtin/#error) 接口,但是使用的是自定义类型 [upspin.io/errors.Error](https://godoc.org/upspin.io/errors#...

  • 120
    Go 调优技术

    ## 内存管理 在开始探索 Go 调优技术和工具之前,我们需要先了解一下 Go 内存模型,它可以帮助我们理解内存是如何使用的。 Go 实现的是 _并行的_ [标记-清除垃圾回收器](http://wiki.c2.com/?MarkAndSweep)。在 _传统的_ 标记-清除模型中,垃圾回收器会先让程序停下来(也就是,“stop the world”),然后查找已经失效的对象,并把这些对象清理掉(也就是,释放内存)。因为程序在运行中会移动引用(references),导致垃圾的识别和...

  • 120
    Golang 之于 DevOps 开发的利与弊(六部曲之一):Goroutines, Channels, Panics, 和 Errors

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go_devops/1.png) 对于你的下一个 DevOps 应用来说,Google 公司的 Go 可能是完美的语言。作为由 6 篇组成一个系列文章的第一篇,我们从 goroutines、panics 和 errors 开始深入研究 Go 语言的利与弊,因为这些利与弊涉及构建 DevOps 应用。 在这篇博客中,我们已经称赞了 Google 公司...

  • 120
    用不到 100 行的 Golang 代码实现 HTTP(S) 代理

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/http-s-proxy/header.jpeg) 我们的目标是实现一个能处理 HTTP 和 HTTPS 的[代理服务器](https://en.wikipedia.org/wiki/Proxy_server)。代理 HTTP 请求的过程其实就是一个解析请求、将该请求转发到目的服务器、读取目的服务器响应并将其传回原客户端的过程。这个过程只需要内置的 HT...

  • 120
    Go 语言“可变参数函数”终极指南

    ![Variadic Funcs](https://raw.githubusercontent.com/studygolang/gctt-images/master/variadic-func/title.png) ### 什么是可变参数函数? 可变参数函数即其参数数量是可变的 —— 0 个或多个。声明可变参数函数的方式是在其参数类型前带上省略符(三个点)前缀。 >译者注:“可变参数函数”在一些翻译中也称“变长函数”,本篇译文中采用“可变参数函数“ ![what is v...

  • 120
    Go 语言如何去解决 Web 开发人员面临的众多问题?

    坦白的说,我的团队非常厌恶我对 Go 语言传道的方式,每当我们团队的代码库出现问题时,他们希望我用一种更委婉的方式提出。 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/web-developers/Screen-Shot-2016-01-29-at-11-57-56.png) 我学会的第一门编程语言是 PHP,这是个优秀的语言,我可以用它很快地构建 Web 应用程序,这些应用程序也能够达到预...

  • 并行化 Golang 文件 IO

    在这篇文章中,我们会使用一些 Go 的著名并行范例(Goroutine 和 WaitGroup),高效地遍历有大量文件的目录。所有代码都可以在 GitHub [这里](https://github.com/Tim15/golang-parallel-io)找到。 我正在开发一个项目,编写程序来将一个目录打包成一个文件。然后,我开始看 Go 的文件 IO 系统。其中貌似有几种遍历目录的方法。你可以使用 `filepath.Walk()`,或者你可以自己写一个。[有些人指出](https://...

  • 用 Go 写一个服务容器( Service Container )

    我最近一直在做一个相当大的 API 项目,里面包括很多路由规则( routes )、服务接口( services )和处理函数( handlers )等。首先,我注意到 `main.go` 文件的启动过程开始越来越臃肿。 为了避免设置全局的服务接口,我使用共享结构体( struct )将服务接口与处理函数绑定在一起。举个例子: main.go ```go package main func main() { r := gin.Default() ...

  • 120
    注释你的代码

    每隔一段时间,网上总会突然出现一些令人讨厌的帖子,其观点是:不应该为代码写注释,它存在的唯一原因是因为代码本身不足够好。对于这些论点,我完全不能苟同。 ## 烂代码 他们的观点也不完全是错误的。没有人能说自己的代码足够好。代码本身也会慢慢变坏。你知道什么时候代码腐烂得最厉害吗?当你六个月没有碰这些代码的时候!当回过头再读的时候,你会非常好奇:“这个作者到底是怎么想的?”(于是,使用 git blame 来查看历史记录,没想到代码竟然是自己写的,因为这是你的代码。) 反对注释者的...

  • 120
    可视化 Go 语言中的并发

    本文作者提供了在 2016 的 GopherCon 上的关于 Go 并发可视化的[主题演讲视频](https://www.youtube.com/watch?v=KyuFeiG3Y60)。 Go 语言一个鲜明的优点就是内置的基于 [CSP](https://en.wikipedia.org/wiki/Communicating_sequential_processes) 的并发实现。Go 可以说是一个为了并发而设计的语言,允许我们使用它构建复杂的并发流水线。但是开发者是否在脑海中想象过不同...

  • 120
    图解 Go 中的延迟调用 defer

    > 本教程将通过几个实用的例子讲解 Go 语言中的 **defer** 的用法 ## 什么是 defer ? 通过使用 `defer` 修饰一个函数,使其在外部函数 ["返回后"](https://medium.com/@inanc/yeah-semantically-after-is-the-right-word-fad1d5181891) 才被执行,即便外部的函数返回的是 [panic 异常](https://golang.org/ref/spec#Handling_panics...

  • 120
    深入理解 Go 标准库之 bufio.Scanner

    众所周知,[带缓冲的 IO 标准库](https://golang.org/pkg/bufio/) 一直是 Go 中优化读写操作的利器。对于写操作来说,在被发送到 `socket` 或硬盘之前,`IO 缓冲区` 提供了一个临时存储区来存放数据,缓冲区存储的数据达到一定容量后才会被"释放"出来进行下一步存储,这种方式大大减少了写操作或是最终的系统调用被触发的次数,这无疑会在频繁使用系统资源的时候节省下巨大的系统开销。而对于读操作来说,`缓冲 IO` 意味着每次操作能够读取更多的数据,既减少了系统调...

  • 120
    6 款最棒的 Go 语言 Web 框架简介

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/top-6-web-frameworks-for-go-as-of-2017/twitter_status.jpg) https://twitter.com/ThePracticalDev/status/930878898245722112 如果你只是想写一个自己用的小网站,或许你不需要框架,但如果你是要开发一个投入生产运营的网站,那么你肯定会需...

  • 120
    Go 语言函数众生相

    ### 本文是对匿名函数、高阶函数、闭包、同步、延时(defer)及其他 Go 函数类型或特性的概览。 ![The Zoo of Go Funcs](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-functions-overview/The_zoo_of_go_funcs.png) > *这篇文章是针对 Go 语言中不同的函数类型或特性的摘要总结。* > > *更为深入的探讨我会在近期的文章...

  • Go 语言 bufio 包介绍

    [原文链接](https://medium.com/golangspec/introduction-to-bufio-package-in-golang-ad7d1877f762) [bufio](https://golang.org/pkg/bufio/) 用来帮助处理 [I/O 缓存](https://www.quora.com/In-C-what-does-buffering-I-O-or-buffered-I-O-mean/answer/Robert-Love-1)。 我们将通过一...

  • Go语言中包的风格指南

    # Go语言中包的风格指南 Go 语言也有自己的命名与代码组织规则。漂亮的代码,布局清晰、易读易懂,就像是设计严谨的 API 一样。拿到代码,用户首先看到和接触的就是布局、命名还有包的结构。 这篇文章不是为了给大家设立硬性的规定,而是用实践引导大家形成自己的规则。因为具体问题要具体分析,通过自己的判断才能挑选出最恰当的规则。 ## 包 所有的 Go 代码都是以包的形式组织起来的。Go 中的包就是目录或文件夹里面包括一个或者多个以 `.go` 结尾的文件。用目录或文件夹这样...

  • 120
    Go Slice vs Map

    Slice 和 Map 是 Go 中的两种重要的数据类型。本文将记录我关于这两种数据结构性能的一些关键的发现。 在讨论性能方面之前,我们先来简单介绍一下 Slice 和 Map。 **Slice:** Slice 是构建在数组之上的一种抽象数据结构。Slice 拥有一个指向数组开始位置的指针、数组长度以及 Slice 可以使用该数组的最大容量。Slice 可以按需增长或收缩。Slice 的增长通常包括为底层的数组重新分配内存。像 copy 和 append 这样的函数可以帮助增...

  • 理解 Go 语言中的 panic 输出

    我的代码有一个 bug。? ``` panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x30 pc=0x751ba4] goroutine 58 [running]: github.com/joeshaw/example.UpdateResponse(0xad3c60, 0xc42025730...

  • 120
    为何 Go 的人气正在飞涨

    #### 仅仅两年时间,在最流行的编程语言中,Go 语言从第 65 名飙升至第 17 名。以下是其快速增长的原因。 ![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/build_structure_tech_program_code_construction.png?itok=nVsiLuag) 图像来自于 _opensource.com_ [Go 语...

  • Go 语言核心文件调试

    程序调试对于检查和理解程序运行过程和状态是非常有用的。 一个核心转储文件( core dump file )中包含程序进程运行时的内存信息和进程状态。它主要用于程序的问题调试,以及在运行过程中理解程序的状态。这些对于我们诊断程序问题原因和分析生产环境中的服务问题有非常大的帮助。 在本文中,我会用一个非常简单的 hello world 网页应用服务举例,实际情况,我们的程序会更加复杂。对核心转储文件的分析意义在于可以帮助我们查看程序当时的运行情况,并可能让我们有机会重现当时的程序问题。...