• 鸭子类型 vs 结构化类型 vs 标称类型

    Go 语言是哪一种? 编程语言具有类型概念 - 布尔类型,字符串,整型或者被称为类或者结构体的更加复杂的结构。根据如何将类型解析并赋值给各种构造(例如变量,表达式,函数,函数参数等),编程语言可以归类为鸭子类型,结构化类型或标称类型。 本质上,分类决定了对象如何被解析并推断为具体的类型。 ![](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20200608-duck-typing-vs-st...

  • Go 中基于 IP 地址的 HTTP 请求限流

    如果你在运行 HTTP 服务并且想对 endpoints 进行限速,你可以使用维护良好的工具,例如 [github.com/didip/tollbooth](https://github.com/didip/tollbooth)。但是如果你在构建一些非常简单的东西,自己实现并不困难。 我们可以使用已经存在的试验性的 Go 包 `x/time/rate`。 在本教程中,我们将创建一个基于用户 IP 地址进行速率限制的简单的中间件。 ## 「干净的」HTTP 服务 让我们从构建一...

  • Go 中可取消的读取操作

    在使用 Go 进行工作时,使用 `io.Reader` 和 `io.Writer` 接口是最常见的情场景之一。这很合理,它们是数据传输的主力接口。 关于 `io.Reader` 接口,有一点令我困惑:它的 `Read()` 方法是阻塞的,一旦读取操作开始,你没有办法去抢占它。同样,也无法在读取操作上执行 `select` 操作,异步协调多个 `io.Reader` 时的读取操作会有点棘手。 `io.ReadCloser` 是 Go 提供的一个常用的退出通道,在许多情况下,它确实允许你...

  • Go:gops 如何与 runtime 交互?

    ![](hhttps://raw.githubusercontent.com/studygolang/gctt-images2/master/20200405-go-how-does-gops-interact-with-the-runtime/1_3PCyB5PhH_NEZoNnj693dA.png) 本文基于 Go 1.13 和 gops 0.3.7。 `gops` 旨在帮助开发人员诊断 Go 进程并与之交互。它提供了追踪运行中的程序数秒钟,通过 `pprof` 获取 CPU 的...

  • 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 团队的一封公开信 —— 关于 try

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

  • 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` 开发者来说,考虑到性能,最佳实践是系统地使用指针而非结构体副本。 我们将回顾两个用例,来理解使用指针而非结构体副本...

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

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