当我刚开始学习 Go 时,我正在玩不同的多路复用器(multiplexer),它可以作为 API 服务器使用。我发现了 3 个是非常有用的好东西,即 Gorilla mux、httprouter 和 bone(按性能从低到高排列)。即使 bone 有最佳性能和更简单的 handler 签名,但对于我来说,它仍然不够成熟,无法用于生产环境。因此,我最终使用了 httprouter。在本教程中,我将使用 httprouter 构建一个简单的 REST API 服务器。 我要晨读

已有36人晨读

在写《Go语言标准库》的第九章 —— 测试 时,看到了此文,讲解通俗易懂,于是翻译为中文,作为学习《Go语言标准库》的第九章的补充材料。如果你之前不知道 Go 中的单元测试,通过学习本文,你一定知道该怎么写了。 我要晨读

已有401人晨读

写 Go 的人往往对它的错误处理模式有一定的看法。按不同的语言经验,人们可能有不同的习惯处理方法。这就是为什么我决定要写这篇文章,尽管有点固执己见,但我认为听取我的经验是有用的。我想要讲的主要问题是,很难去强制执行良好的错误处理实践,错误经常没有堆栈追踪,并且错误处理本身太冗长。不过,我已经看到了一些潜在的解决方案,或许能帮助解决一些问题。 我要晨读

已有396人晨读

这篇文章想聊聊Go语言下的设计模式问题(包括 单例模式、工厂模式、装饰器模式),我觉得这个话题还是比较有意思的。Golang没有像java那样对设计模式疯狂的迷恋,而是摆出了一份“看庭前花开花落,望天空云卷云舒”的姿态。 我要晨读

已有443人晨读

尽管 Golang 推荐通过 channel 进行通信和同步,但在实际开发中 sync 包用得也非常的多。另外 sync 下还有一个 atomic 包,提供了一些底层的原子操作(这里不做介绍)。本篇文章主要介绍该包下的锁的一些概念及使用方法。 我要晨读

已有299人晨读

Go内存管理基于 tcmalloc,使用连续虚拟地址,以页(8k)为单位、多级缓存进行管理;在分配内存时,需要对size进行对齐处理,根据best-fit找到合适的mspan,对未用完的内存还会拆分成其他大小的mspan继续使用。在new一个object时(忽略逃逸分析),根据object的size做不同的分配策略。本文探索Go内存管理。 我要晨读  相关阅读: 网页链接 

已有267人晨读

程序的性能优化无非就是对程序占用资源的优化。对于服务器而言,最重要的两项资源莫过于 CPU 和内存。性能优化,就是在对于不影响程序数据处理能力的情况下,我们通常要求程序的 CPU 的内存占用尽量低。反过来说,也就是当程序 CPU 和内存占用不变的情况下,尽量地提高程序的数据处理能力或者说是吞吐量。本文详细介绍 Go 程序的性能优化及 pprof 的使用。 我要晨读

已有423人晨读

这篇文章想聊聊如何给gc减负的问题,也即我们在写业务的时候,有时候需要考虑下gc老人家的感受,但又不能丧失代码的可读性,有些情况下代码需不需要优化,优化后能取得多大的性能提升,其中的平衡需要把握。 我要晨读

已有321人晨读

对于 Golang 开发者来说 context(上下文)包一定不会陌生。但很多时候,我们懒惰的只是见过它,或能起到什么作用,并不会去深究它。本文探究 context 的原理、使用示例。 我要晨读

已有551人晨读

字典是很重要的数据结构。map 在 Go 语言中使用的很频繁。本文介绍 map 的使用和内部实现,由浅入深,值得一读。 我要晨读

已有706人晨读

检查程序的执行路径和当前状态是非常有用的调试手段。核心文件(core file)包含了一个运行进程的内存转储和状态。它主要是用来作为事后调试程序用的。它也可以被用来查看一个运行中的程序的状态。这两个使用场景使调试文件转储成为一个非常好的诊断手段。我们可以用这个方法来做事后诊断和分析线上的服务(production services)。本文介绍调试 Go 语言的 Core Dumps。 我要晨读

已有285人晨读

剖析使Go语言高效的5个特性(5/5): Goroutine的栈管理。这是高效特性的最后一讲。这些特性个个都很有效,他们之间还相互依赖。比如,如果没有了可衍生的栈,运行环境将多个goroutine复用到线程上面就不会很有效。内联在把多个小函数合并成大函数的时候也避免了栈大小的检查开销。逃逸分析用栈代替堆来存储局部变量,这样也减少来垃圾回收机制的压力。逃逸分析还提升了缓存的性能(cache locality)。没有可衍生的栈,逃逸分析又会对栈造成很大的压力。 我要晨读

已有332人晨读

剖析使Go语言高效的5个特性(4/5): Goroutines。本文是 David 在 2014 年参加日本东京的 Gocon 会议的演讲的中文翻译。虽然时间有点久,但相信 David 大神的讲解,会让你收益颇多。Go语言有 goroutines。它们是Go语言里并发编程的基石。 我要晨读

已有314人晨读

剖析使Go语言高效的5个特性(3):垃圾回收机制。本文是 David 在 2014 年参加日本东京的 Gocon 会议的演讲的中文翻译。虽然时间有点久,但相信 David 大神的讲解,会让你收益颇多。本篇讲解垃圾回收机制。 我要晨读

已有377人晨读

剖析使Go语言高效的5个特性(2):函数调用不是免费的。本文是 David 在 2014 年参加日本东京的 Gocon 会议的演讲的中文翻译。虽然时间有点久,但相信 David 大神的讲解,会让你收益颇多。本篇讲解函数调用相关特性。 我要晨读

已有471人晨读

剖析使Go语言高效的5个特性(1):变量的处理和存储。本文是 David 在 2014 年参加日本东京的 Gocon 会议的演讲的中文翻译。虽然时间有点久,但相信 David 大神的讲解,会让你收益颇多。 我要晨读

已有512人晨读

goroutine stack多大呢?是固定的还是动态变化的呢?stack动态变化的话,什么时候扩容和缩容呢?如何实现的呢?对服务有什么影响吗?如何排查栈扩容缩容带来的问题呢?本文聊一聊 goroutine stack。 我要晨读

已有451人晨读

和大多数计算机语言一样,Go type 默认包含常用的基础数据类型,boolean,numeric and string,这些类型称为 pre-declarered types,这些基础的数据又可以进一步构成更复杂的类型 array,struct,map,slice,channel 等。Type 可以是带名称和不带名称的,称之为 named type 和 unnamed type。 我要晨读

已有382人晨读

Go语言的性能可以做到非常好,但是一些标准库的性能很可能会拖后腿,比如regexp和encoding/json。如果在性能要求较高的场合使用,要根据实际情况做相应优化。on-cpu/off-cpu火焰图的使用是程序性能分析的利器,往往一针见血。虽然生成一张火焰图比较繁琐(尤其是off-cpu图),但绝对值得拥有! 我要晨读

已有950人晨读

Go 1.7,testing 包在 T 和 B 类型上引入了一个 Run 方法,允许创建子测试和子基准测试。子测试和子基准测试的引入可以更好地处理故障(failures),细化控制从命令行运行的测试,并行控制,并且经常会使代码更简单、更易于维护。本文介绍使用方法。 我要晨读

已有438人晨读