• Go 中的性能测量

    Vincent Blanchon 2019 年 9 月 19 日 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/intrumentation-in-go/1.png) “A Journey With Go” 专属插图,由 Renee French 根据原始 Go Gopher 制作。 ℹ️ *本文基于 Go 1.13.* `go test` 命令提供了许多出色的功能,比如代码...

  • 120
    Go 中的进阶测试模式

    ![image](https://raw.githubusercontent.com/studygolang/gctt-images/master/advanced-testing-patterns/heading.jpg) Go 使编写测试非常简单。实际上,测试工具是内置在标准工具链里的,你可以简单地运行 `go test` 来运行你的测试,无需安装任何额外的依赖或任何别的东西。测试包是标准库的一部分,我很高兴地看到它的使用范围非常广泛。 当你在使用 Go 编写服务实现时,希望你的...

  • Go 测试高级窍门和技巧

    2017 年 2 月 1 日 · 5 min 阅读 这篇文章基于我在 [维尔纽斯的 Golang 交流会](https://www.meetup.com/Vilnius-Golang/) 上的演讲。 我读了很多博客,看了很多演讲并把所有这些窍门和技巧都集中在一个地方。首先我想感谢那些提出这些想法并把它们分享到社区的人。我从下面的这些工作中借鉴了资料和示例: - [Andrew Gerrand - Testing Techniques](https://talks.golang....

  • 调试 Go 的代码生成

    2016 年 10 月 15 日 *上周,我在 [dotGo](http://www.dotgo.eu/),参加一个最棒的 Go 会议,与大西洋彼岸的 Gopher 们相聚。我做了一个简短迅速的演讲,关于使用工具链中可用工具来进行代码生成的检查。这篇文章给没能参加会议的 Gopher 们过一遍演讲的内容。幻灯片在 [go-talks](https://go-talks.appspot.com/github.com/rakyll/talks/gcinspect/talk.slide) 也能找...

  • 阅读挑战:Go 的堆排序

    ![image](https://raw.githubusercontent.com/studygolang/gctt-images/master/heap-sort-in-go/1_EGrh0TP0gMPgQc0rTVUPzg.jpeg) *<center> 一堆废旧汽车 </center>* 堆排序是一种漂亮的排序算法。它使用一个最大堆对一系列数字或其他定义了顺序关系的元素进行排序。在这篇文章里,我们将深入探究 **Go 标准库**中堆排序的实现。 ## 最大堆 Firs...

  • 使用 Prometheus 对 Go 应用程序进行监测

    监测服务级别的指标能让团队成员更清晰的看到你的程序表现如何,你的程序如何被使用,并且可以帮助定位潜在的性能瓶颈。 [Prometheus](https://prometheus.io/) 是一个开源的监测解决方案,原生的服务发现支持让它成为动态环境下进行服务监测的一个完美选择。Prometheus 支持从 [AWS, Kubernetes, Consul 等](https://prometheus.io/docs/prometheus/latest/configuration/config...

  • Goroutine 的同步(第三部分)

    - 第一部分:https://studygolang.com/articles/14118 - 第二部分:https://studygolang.com/articles/14478 ## mutex 和 sync.Once 介绍 ![image](https://raw.githubusercontent.com/studygolang/gctt-images/master/sync-goroutine/part3-1.jpeg) 假设你的程序中有一个需要某种初始化的功能。...

  • goroutine 的同步(第二部分)

    > Channel 通信 第一部分介绍了发送与接收操作之间最直观的顺序关系: > *向一个 Channel 中发送数据先于接收数据。* 于是,我们能够控制分布于两个 goroutine 中的操作的顺序。 ```go var v int var wg sync.WaitGroup wg.Add(2) ch := make(chan int) go func() { v = 1 ch <- 1 wg.Done() }() go fu...

  • goroutine 的同步(第一部分)

    ![image](https://raw.githubusercontent.com/studygolang/gctt-images/master/sync-goroutine/part1.jpeg) 假设 Go 程序启动了两个 goroutine: ```go package main import ( "fmt" "sync" ) func main() { var v int var wg sync.WaitGroup ...

  • 使用 Flamegraphs 对 Go 程序进行性能分析

    2018 年 2 月 28 日 应用的性能问题生来就是无法预料的 —— 而且他们总是在最坏的时间露头。让情况更糟的是,很多性能分析工具都是冷冰冰的,复杂难懂的,用起来彻头彻尾令人困惑的 —— 来自于 `valgrind` 和 `gdp` 这样最受推崇的性能分析工具的用户体验。 `Flamegraphs` 是由 linux 性能分析大师 Brendan Gegg 创造的一个工具,在一般的 linux 性能追踪 dump 之上生成一个 SVG 可视化层 ,给定位和解决性能问题这个复杂的过程带来了...

  • 在 Go 1.11 下调试延迟问题

    诊断和调试复杂系统是一件复杂的事。经常需要多个层次的诊断数据来弄清楚延迟问题可能的原因。 一个分布式系统由多个服务器组成,这些服务器互相依赖,共同完成对用户请求的服务。在任何时候, - 系统中的一个进程可能会处理大量的请求。 - 在高并发的服务器中,没有容易的途径能将一个请求生命周期内的各个事件分离出来。 - 在高并发的服务器中,对于响应一个请求所发生的事件,我们没有很好的可见性。 随着 Go 在近些年来变成编写服务器的一门流行语言,我们意识到理解 Go 进程在一个请求的生...

  • 周五有感:失败,快速且猛烈

    **摘要**:*在实现一个服务或 API 时,如果你收到一个你不太理解的请求,最友好的方式就是返回一个错误信息。* 让我们来考虑这样一个 API: `GET /mySum?num=3&num=42` 非常简单,是不是?我可能会这样来实现它: ```go func mySum(args url.Arguments, w http.ResponseWriter) { w.Write(int(args["num"][0]) + int(args["num"][1])) ...

  • 剖析 go 语言的函数调用

    让我们来看几个 go 函数调用的简单例子。通过研究 go 编译器为这些函数生成的汇编代码,我们来看看函数调用是如何工作的。这个课题对于一篇小小的文章来讲有点费劲,但是别担心,汇编语言是非常简单的,连 CPU 都能理解它。 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/anatomy-of-a-function/1_CKK4XrLm3ylzsQzNbOaroQ.png) *作者:Rob Baines...