本篇文章内容来源于Golang核心开发组成员Andrew Gerrand在Google I/O 2014的一次主题分享“Testing Techniques”,即介绍使用Golang开发 时会使用到的测试技术(主要针对单元测试),包括基本技术、高级技术(并发测试、mock/fake、竞争条件测试、并发测试、内/外部测试、vet工具等)等,总结的很全面,这里整理记录下来,希望能给大家带来帮助。 我要晨读

已有1071人晨读

Go 语言的 channel 本身是不支持 timeout 的,所以一般实现 channel 的读写超时都采用 select。在写超时代码时,你可能会写出性能差的甚至错误的代码。文章从遇到的问题,到深入讨论 channel 的 timeout 机制,并做了一些性能上的测试。 我要晨读  相关阅读: 网页链接 

已有1788人晨读

Go Runtime hashmap实现。map 的底层实现就是一个 hash 表,大体结构上和平时在脑海里的 hash 表差不多。hashmap 通过一个 bucket 数组实现,所有元素将被 hash 到数组中的 bucket 中,bucket 填满后,将通过一个 overflow 指针来扩展一个 bucket 出来形成链表,也就是解决冲突问题。本文总结了一些实现细节点。 我要晨读

已有1060人晨读

深入Go语言网络库的基础实现。本文将网络库的底层实现给大体上引导了一遍,知道底层代码大概实现在什么地方,方便结合源码深入理解。Go语言中的高并发、同步阻塞方式编程的关键其实是”goroutine和调度器”,针对网络IO的时候,我们需要知道EAGAIN这个非常关键的调度点,掌握了这个调度点,即使没有调度器,自己也可以在epoll的基础上配合协程等用户态线程实现网络IO操作的调度,达到同步阻塞编程的目的。 我要晨读

已有1134人晨读

位操作是程序设计中对位模式按位或二进制数的一元和二元操作. 一般的,位运算比乘除法运算要快。所以,在一些服务器程序中,经常可以看到位操作的影子。另外,位运算能够实现一些特殊的功能,本文介绍了Go语言通过位运算实现 判断奇偶、求1的个数等。 我要晨读

已有961人晨读

我们都知道Go语言是原生支持语言级并发的,这个并发的最小逻辑单元就是goroutine。goroutine就是Go语言提供的一种用户态线程,当然这种用户态线程是跑在内核级线程之上的。当我们创建了很多的goroutine,并且它们都是跑在同一个内核线程之上的时候,就需要一个调度器来维护这些goroutine,确保所有的goroutine都使用cpu,并且是尽可能公平的使用cpu资源。本文介绍 goroutine和调度器的实现。 我要晨读

已有970人晨读

这几天晨读,推荐了Go语言内存分配器实现方面的文章,不过,之前算是前戏。今天推荐的文章才是真正的理解内存分配器实现。本文将把整个内存分配器的架构以及核心组件给详细的介绍一下,当然亲自对照着翻看一下代码才是王道。 我要晨读

已有1016人晨读

MSpan和FixAlloc一样,都是内存分配器的基础工具组件,但和FixAlloc没太大的交集,各自发挥功效而已。span(MSpan简称span)是用来管理一组组page对象,page就是一个4k大小的内存块而已。span就是将这一个个连续的page给管理起来。本文介绍 Go语言内存分配器-MSpan。 我要晨读

已有828人晨读

昨天晨读分享了Go语言内存分配器设计,了解了内存分配器的大体结构。本文介绍内存分配器中一个工具组件——FixAlloc。FixAlloc称不上是核心组件,只是辅助实现整个内存分配器核心的一个基础工具罢了,由此可以看出FixAlloc还是一个比较重要的组件。让我们一起来了解它。 我要晨读

已有900人晨读

Go语言的整个内存管理子系统主要由两部分组成——内存分配器和垃圾收集器(gc)。整个内存分配器完全是基于Google自家的tcmalloc的设计重新实现了一遍。本文介绍Go语言内存分配器设计。 我要晨读

已有1051人晨读

看了Go runtime中关于select的实现,发现select语句位于for循环之内执行的时候,每一遍循环都需要在底层runtime中经历malloc对象到free对象的过程,我认为这个频繁的内存分配和释放的代价并不小,至少内存不是处于一种稳定的状态。因此,我实际的测试一把使用select来操作channel和不使用select操作channel两种情况下的内存情况。 我要晨读

已有988人晨读

我们如何提供异步版本的API?通常最好的答案是什么也不要做。因为调用者可以使用future特性结合“async”或者任务启动特性,从API外面将一个调用变成异步执行调用。本文从同步API开始介绍了多种异步方式。 我要晨读

已有1296人晨读

随着Golang, Erlang, Scale等为并发设计的程序语言的兴起,新的并发模式逐渐清晰。正如过程式编程和面向对象一样,一个好的编程模式需要有一个极其简洁的内核,还有在此之上丰富的外延,可以解决现实世界中各种各样的问题。本文以GO语言为例,解释其中内核、外延,好文值得多次阅读。 我要晨读

已有991人晨读

Go语言有一个非常大的亮点就是支持语言级别的并发。语言级别提供并发编程,究竟有多重要,可能需要你亲自去体会多线程、事件+callback等常见的并发编程模型后才能准确的感受到。为了配合语言级别的并发支持,channel组件就是Go语言必不可少的了。本文和大家一起探讨runtime中channel的实现。 我要晨读

已有1049人晨读

我们总是使用sleep()类函数来让线程暂停一段时间,在Go语言里,也是使用Sleep()来暂停goroutine。 那么Go语言的sleep究竟是如何现实的呢?当然你翻看标准库中的time包里面的sleep.go源码时, 你可能会觉得看不明白,因为支持sleep功能的真正实现是在runtime里面。本文带领大家看看runtime中的timer究竟长什么样子。 我要晨读

已有977人晨读

我们晨读了RPC的客户端和服务端,那么,Go RPC 的性能怎么样呢?需要进行性能测试。这次benchmark主要以下两个维度进行测试:1.单个连接上,不同并发数的QPS;2.固定100个并发,不同连接数的QPS。当然,性能应该是一个需要我们持续关注和优化的问题。 我要晨读

已有1238人晨读

实现一个rpc服务器很难吗?rpc服务器也就是在tcp服务器的基础上加上自定义的rpc协议而已。一个rpc协议里,主要有个3个非常重要的信息:调用的远程method名字;call参数;客户端生成的调用请求seq。昨天晨读介绍了RPC客户端的实现,今天介绍服务端的实现。 我要晨读

已有965人晨读

Go语言标准库能够自带一个rpc框架还是非常给力的,这可以很大程度的降低写后端网络通信服务的门槛,特别是在大规模的分布式系统中,rpc基本是跨机器通信的标配。rpc能够最大程度屏蔽网络细节,让开发者专注在服务功能的开发上面。本文介绍Go语言rpc框架的客户端内部实现(客户端)。 我要晨读

已有1150人晨读

Go语言的Web框架,现在还是蛮多的,比如:revel、beego、martini,还有无闻的Macaron。本文着重介绍了revel、beego、martini这三个框架。其实还有很多挺好玩的实现,比如类似java struct的 xweb,类似 python flask 的 entropy 和 ASP.NET MVC 的 goku。有兴趣可以多看看。 我要晨读

已有1057人晨读

martini 是非常优雅的Go Web框架。它基于依赖注入的思想,仿照Sinatra的路由设计,参考Express的中间件设计,而且核心微小,扩展方便,非常值得学习。但是由于本身API设计简洁,使很多细节无法从代码理解。所以,本文作者写一点笔记记录martini的工作方式。 我要晨读

已有1125人晨读