我们如何提供异步版本的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人晨读

Go1.4中,对stack处理方式由之前的"segmented stacks"改为了"continuous stacks"。关于Go语言对stack的处理机制、发展历史、存在问题等,CloudFlare的一篇官方blog进行了系统的阐述,这里的内容就是 翻译自CloudFlare的那篇blog:《How Stacks are Handled in Go》。 我要晨读

已有847人晨读

在程序设计中,搜索是使用频率很高的一个操作。现代的高级语言一般都有相应的库提供支持。编程珠玑上讲二分查找时,说学生中完全写对的不多。可见,二分查找的思想虽然简单,但实现起来,要保证没有问题,还是有一些难度的,同时性能也会有差异。本文介绍 Go 中 binary array search的几种写法。 我要晨读

已有842人晨读

Go语言类库中,有两个官方的服务器框架,一个HTTP,一个是RPC。使用这个两个框架,已经能解决大部分的问题,但是,也有一些需求,这些框架是不够的,这篇文章,先分析一下HTTP 和 RPC服务器的特点, 然后结合这两个服务器的特点,实现了一个新的服务器,这个服务器非常适合客户端和服务器端有大量交互的情况。 我要晨读

已有1225人晨读

大多数现代Web组件栈允许通过栈式/组件式中间件“过滤”请求,这样就能干净地从web应用中分离出横切关注点(面向切面程序设计中的概念)。本文作者尝试在Go语言的http.FileServer中植入钩子,发现实现起来十分简便。 我要晨读

已有1020人晨读

Go编程新手可能会偶然发现Go语言---与一个Goroutine可用栈空间大小相关---的一个古怪特性。这通常是由于程序员 无意间构造了一个无限递归函数调用而产生的。大多数程序员应该都遇到过无限递归导致的问题,Go 在这方面的做法和其他语言不同。本文阐述为何Goroutine的栈空间可以无限大? 我要晨读

已有1143人晨读

Go语言提供了一个名为interface{}的类型,你可以向其赋予几乎任意类型的值。假设你需要一个可以接收任意类型slices的函数,你可能会这么定义:func Method(in []interface{}){...},然后调用传递[]int{1,2,3},但这样会编译错误。本文讨论了以任意类型的slices作为输入参数的解决方法。 我要晨读

已有1061人晨读

在国内(也许国外也是),学习Go语言的人,大部分先会尝试用来写Web,这样,自然会使用模板,Go 标准库中提供了模板的库,该库在渲染页面模板的时候默认会转义字符串中的 html 标签,但有时我们并不想转义 html 标签。本文介绍如何让 html/template 不转义 html 标签。 我要晨读

已有1445人晨读

是一个很有意思的语言,第一次看它介绍时,就很喜欢。半年前有机会用它写了几个线上程序。其中一个程序Router,每天需要转发几千万的请求。由于需要根据请求内容决定route路径,它需要加载几十万deal的信息到内存供查询。问题来了,用map装的几十万数据让gc很辛苦。本文介绍GC调优。注意,最新版本的Go语言GC性能可能会更好。 我要晨读

已有1408人晨读

多核化和集群化是互联网时代的典型特征,那语言需要哪些特性来应对这些特征呢?多数语言在语法层面并不直接支持协程,而通过库的方式支持的协程的功能也并不完整,而Go对协程提供了语言级支持。那么到底Go语言对企业来说有什么好处?本文简单介绍了企业选择Go语言的12个理由。 我要晨读

已有823人晨读

在网络游戏服务器设计中,一般都会遇到协议多路复用的场景。本文描述了使用Go语言实现的、适应于Go语言并发模型的一种支持多路复用的网络协议处理框架,并提供了框架的代码实现。作者将这种框架用于网络游戏服务器中的协议处理,但也可用于其他领域。 我要晨读

已有969人晨读

在go语言里,提倡用信道通讯的方式来替代显式的同步机制。但是我发现有的时候用信道通讯方式实现的似乎也不是很好(暂不考虑效率问题)。本文通过一种特定的场景,采用多种实现方案讲解,怎么样实现支持并发访问的数据集合更好?并引用 golang-china 上的讨论。 我要晨读

已有784人晨读