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

有时候有这样一种应用场景:需要等待多个事件到达,然后返回尽可能多的事件;如果没有事件到达就阻塞等待。例如服务器等待客户端建立连接,或者等待客户端数据等就有这种应用需求。在go语言里,可以利用select原语和它的非阻塞(default)分支组合实现这个功能。本文介绍 select 多路选择的模拟实现。 我要晨读

已有862人晨读

在使用go语言写一个文件转换的工具,使用到了goroutine来提高处理效率。在写代码的过程中,对goroutine的使用方式经历了三个版本的变动,觉得有必要记录和总结一下,也需要不断思考怎么样才是用go语言的思考去写go语言代码。Write your Go code in a Go way。 我要晨读

已有980人晨读

作为Go团队的开发者之一,Francesc可能比世界上其他人接触到的Go语言程序员都要多。正因为有了这样的有利条件,他把Go语言的学习过程划分为5个阶段。这篇文章对于每一个学习阶段都给出了交互式的代码片段。点击函数名你就可以跳到具体的函数定义,方便进行深入的研究。 我要晨读  相关阅读: 网页链接 

已有1145人晨读

GoF对组合模式的定义是,将对象组合成树形结构以表示“部分整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。本文通过现实生活中的场景来分享 Go语言设计模式实践:组合(Composite)。 我要晨读

已有835人晨读

在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档、图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只能靠看标准库源代码自己琢磨,所以我特别想在这方面有一些收集和总结。本文分享 Go语言设计模式实践:迭代器(Iterator)。 我要晨读

已有1658人晨读

初学者需要注意的问题:map 和 变量作用域。直接对map对象使用[]操作符获得的对象不能直接修改状态,通过查询map获得的对象是个拷贝,对此对象的修改不会影响原有对象的状态;多变量同时赋值或者初始化可能会产生bug。 我要晨读  相关阅读: 网页链接 

已有731人晨读

go语言的channel有一个看上去很奇怪的特性,就是如果向一个为空值(nil)的channel写入或者读取数据,当前goroutine将永远阻塞。这看上去似乎是一个bug。但是为什么go team要这么设计呢?本文对此进行了详细的讲解。这得一读。 我要晨读

已有1111人晨读

稍微复杂一些的程序的初始化会涉及到多个模块,任何一个模块初始化失败以后,就应该把已经初始化的其他模块一一回滚。这容易使得初始化的错误处理比较冗长,包含重复代码;或者执行路径跳转不容易读懂,也容易出错。用go语言提供的defer和有名返回值的机制,可以比较容易地解决这个问题,让初始化错误处理简洁清晰。 我要晨读

已有1120人晨读

在生成环境中使用 Go 语言两年的总结,从 性能表现(Performance)、内存占用(Memory)、并发性(Concurrency)、可靠性(Reliability)、部署(Deployment)和 天赋(Talent)等方面介绍。 我要晨读

已有1008人晨读

如果你成天与编程为伍,那么并发这个名词对你而言一定特别耳熟。需要并发的场景太多了,例如一个聊天程序,如果你想让这个聊天程序能够同时接收信息和发送信息,就一定会用到并发,无论那是什么样的并发。这次晨读进一步认识golang中的并发。 我要晨读

已有896人晨读