• 使用 defer 的运行时开销

    在 Go 语言中有一个特殊的关键字 `defer`。对于它更多的介绍请看[这里](https://blog.golang.org/defer-panic-and-recover)。`defer` 语句会把一个函数追加到函数调用列表。这个列表会在函数返回的时候依次调用。`defer` 常用来进行各种清理操作。 但是 `defer` 本身是有开销的。使用 Go 的基准测试工具我们可以量化这种开销。 下面两个函数做同样的工作。一个使用 `defer` 语句而另一个不使用: ```go...

  • Go 中的标签

    `Label` 在 `break` 和 `continue` 语句中是可选参数,而在 `goto` 语句中是必传的参数。`Label` 只在声明它的函数中有效。只要函数中声明了 `Label` ,那它在该函数的整个作用域都有效。 ```go func main() { fmt.Println(1) goto End fmt.Println(2) End: fmt.Println(3) } ``` (注意!我们是在 goto 语句之后定义的 `Label`) ...

  • Go 中的任务队列

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

  • 通过 go/parser 理解 Go

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

  • 120
    Go 中的位运算

    ![cover](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-bits/cover.png) 在以前内存和处理能力(CPU)都是非常昂贵的,于是直接在位上编程就成为了处理信息的首选方式(在有些情况下也是唯一的方式)。如今,直接对位进行操作在底层系统、图像处理和密码学等领域还是至关重要的。 在 Go 语言中支持以下几种操作位的方式: ``` & 位与 | 位或 ^ ...

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

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