• 从 JavaScript 到 Go 语言的排序算法

    在计算机科学中,排序的意思是获取一个数组,然后重新对他们进行排列,使他们遵循指定的顺序,例如按字母顺序对字符串进行排序、按最小到最大的顺序对数字进行排序,或按结构中的一个字段对结构数组进行排序。您可以使用它(排序)来提高算法的工作效率,或按特定顺序显示数据(例如时间上的从最近到最远)。 对于 Go 中的排序,标准库提供了 sort 包,有意思的是,它使用了 Go 接口来定义对数据进行排序的规则。如果您使用过 JavaScript 的 Array.prototype.sort 方法,(那么,...

  • 120
    Go: 在我们的 ETL 中使用扇出模式

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/20190703-go-fan-out-pattern/cover.png) Go 语言在构建微服务、特别是有使用 gRPC 的应用中,非常地流行,其实在构建命令行程序时也是特别地好用。为了学习扇出模式,我会基于我们公司使用 ETL 的例子,来介绍这个模式。 ## ETL ETL(提取(Extract),转换(Transform),加载(Lo...

  • Golang 中的标签(Tags in Golang)

    结构体字段的声明可以通过之后放置的文字来标记。标签添加由当前包或外部包使用的元信息。让我们首先回首一下 strcut 声明的样子,然后我们将扔出几个用例,深入研究这个标签。 ## 结构体类型(Struct type) Struct 是一系列字段。每个字段由可选名称和所需类型([源代码](https://play.golang.org/p/q2V_op8_SJk))组成: ```go package main import "fmt" type T1 struct { ...

  • Go GC

    大家好,我是 Okada([@ocadaruma](https://twitter.com/ocadaruma)),LINE 广告平台团队的成员。我对 Go 的 GC (垃圾收集器)有点感兴趣,甚至还促使我专门写一篇关于它的博客。Go 是一门由 Google 开发,并且支持垃圾收集的编程语言。Go 通过[管道](https://tour.golang.org/concurrency/2) 支持并发。很多的公司,包括 Google,都在使用 Go,LINE 也用 Go 来开发工具和服务。 #...

  • 在 Go 运行时中的 Strings

    ## 动机(Motivation) 可以认为这是对 [Rob Pike](https://ai.google/research/people/r) 的一篇关于 Go 字符串的[博客](https://blog.golang.org/strings)的解释。以 Go 程序员的思维来写。 在博客文章中,他说没有什么证据可以证明 Go 字符串是以 slices 的方式实现。我猜这不是他的疏忽,但起码可以证明一点,这不是这篇博客的核心。再说,任何想要自己研究的都可以在使用 Go 代码的过程中...

  • Go 功能:将 Go 程序员带向极限(Functional Go: Taking The Gopher to it's extremes)

    ## 功能范式(The Functional Paradigm) 函数式编程基于简单的规则,目的是使程序保持一致,使并行(更)人性化和简单化,函数是存粹的,它不会改变(变量的)状态,不会改变对象,也不共享状态,代码是声明式的,计算只不过是数学函数的一种实现。 我们来看一个纯粹的函数语言的函数例子: ``` isPalindrome :: (Eq a) => [a] -> Bool isPalindrome x = x == reverse x ``` 上面的代码是 ...

  • 创建和使用 HTTP 中间层(Making and Using HTTP Middleware)

    在构建 Web 应用时,可能需要为许多(甚至全部)HTTP 请求运行一些公共的函数。你可能需要对每个请求进行记录,对每个响应进行压缩,或者在执行一些重要的处理之前检查一下缓存。 组织这种公共函数的一种方法是将其设置为中间层 - 自包含代码,它们在正常应用处理程序之前或之后,独立地处理请求。在 Go 中,使用中间层的常见位置在 ServeMux 和应用程序处理之间,因此通常对 HTTP 请求的控制流程如下所示: `ServeMux => Middleware Handler => Ap...

  • Golang 数据库 mocks(Golang database mocks)

    我们[当前项目的核心](https://heupr.io/)是一个 [MemSQL](https://www.memsql.com/) 数据库,它是我们核心的数据管道;这是一个非常酷的技术,它的速度非常快,我们实在是太喜欢它了。但是,测试跟它相关的代码却有点困难,这个问题通过试验或者当遇到错误(主要是遇到错误)时,很快就可以发现。由于 Go 标准包已通过全面的测试,我只需要确保调用和依赖他们的代码在生产中也能够正常运行就好。 测试我们项目的数据库代码,我通过两个步骤完成。 通过 da...

  • 小函数可能是有害的(Small Functions considered Harmful)

    在这篇博文中,我的目标是: - 揭示小函数的一些似是而非的优点 - 解释为什么我个人认为有点不像建议说的那么好 - 解释为什么小函数有时是适得其反 - 解释一下我认为小函数在 mock 中真正有用的地方 通常,编程建议总是说使用更优雅和有益的小函数。《Code Clean》被普遍认为是一本编程圣经,它有一章专门讲述函数,文章的开始就是介绍一个非常长,令人头疼的函数。该书认为该函数的最大问题是长度过长,并指出: 它(函数)不仅长度太长,而且有多处重复的代码,奇怪的字符串,许...

  • 接口不是值类型(Interface Values Are Valueless)

    ## 介绍(Introduction) 最近,在 Slack 上我看过大量关于接口的问题。大多数时候,答案都很有技术性,并都关注了实现的细节。实现(细节)对于调试很有帮助,但实现对设计却毫无帮助。当用接口来设计代码时,行为才是主要需要关注的。 在这篇博文中,我希望提供一个不同的思考方式,关于接口,和用他们进行代码设计。我想让你停止关注于实现细节,而是关注于接口和具体的数据的关系。 ## 面向数据设计(Data Oriented Design) 我相信写 Go 代码,应该用...

  • Go 语言中提取字段和方法

    struct 是一系列包含名称和类型的字段。通常就像这样: ```go package main import "fmt" type Person struct { name string age int32 } func main() { person := Person{name: "Michał", age: 29} fmt.Println(person) // {Michał 29} } ``` (在这篇博文的接下来部分,我将逐步删除包名、导入...

  • Go 语言中的线程池(Thread Pooling in Go Programming)

    用过一段时间的 Go 之后,我学会了如何使用一个不带缓存的 channel 去创建一个 goroutine 池。我喜欢这个实现,这个实现甚至比这篇博文描述的更好。虽然这样说,这篇博文仍然对它所描述的部分有一定的价值。 [https://github.com/goinggo/work](https://github.com/goinggo/work) ## 介绍(Introduction) 在我的服务器开发的职业生涯里,线程池一直是在微软系统的堆栈上构建健壮代码的关键。微软在 ....

  • Go test 少为人知的特性

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

  • 关于在 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...

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

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

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

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

  • 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 语言机制之内存剖析]...

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

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

  • 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 客户端...