我为什么选择go语言

这里,我并不打算引起语言争论的口水仗,我并不是什么大牛,对语言的造诣也不深,只是想通过自己实际的经历,来说说为什么我在项目中选择go。

其他语言的经历

C++

在接触go之前,我已经有多年的c++开发经验。主要用在游戏服务端引擎开发以及P2P上面,那可是一段痛并快乐的时期,以至于我看到任何的程序钉子问题都觉得可以用c++这把锤子给敲定。但是对于互联网项目开发来说,除非你的团队整体的c++技术水平nb,并且有很强的代码规范,不然真可能是一场灾难,更别说我们现有团队几乎没其他人会这玩意了。

本来,我打算在现有项目中的推送系统中使用c++,并用业余时间写好了一个网络底层库libtnet,但后来还是决定打住,因为没有人能够协助我开发。令我比较欣慰的是,libtnet有一个游戏公司在使用,现处于内部测试阶段,即将放出去,我倒是很期待他们的好消息。

Lua

在做游戏的过程中,我也学会了lua这门语言,并且还有幸接触并完善了云风在Lua 不是 C++中提到的那个恐怖的lua,c++粘合层。

lua真的是一门非常好的语言,性能高,开发快速。不光游戏公司大量使用,在互联网领域,因为openresty的流行,一些公司(包括我们)也开始在web端使用lua进行开发。(颇为自豪的是还给openresty反馈过几个bug)

但是,lua因为太短小精悍,功能库并不多,很多需要自己去实现,而且,写出高性能,高质量lua代码也并不是很容易的事情。另外,因为其动态语言的特性,我们也栽了不少坑,这个后续在详说。

Python

在我来现有的团队之前,他们就已经使用python进行整个系统的开发,甚至包括客户端GUI(这对客户端童鞋当时就是一个灾难,后来换成Qt就舒爽了)。

python的好处不必说,从数不清的公司用它进行开发就知道,库非常丰富,代码简洁,开发迅速。

但是,在项目中经过两年多python开发之后,我们渐渐出现了很多问题:

  • 性能,python的性能是比较偏低的,对于很多性能热点代码,通常都会采用其他的方式实现。在我们的项目中,需要对任何API调用进行签名认证,认证服务我们开始使用的是tornado实现,但很不幸运的是,放到外网并没有顶住压力。所以我们引入openresty,将很多高频操作实现放到openresty实现,终于顶住了。
  • 部署,python的库因为太丰富了,所以我们的童鞋引入了很多的库,个人感觉我们的童鞋可没有造轮子的兴趣。有时候发版本的时候,我们会因为忘记安装一个库导致程序无法运行。这可能跟我们团队没有成熟运维经验有关,后续通过salt,puppet这种发布工具应该能解决。
  • 质量,通常我们都认为,因为python代码的简洁,我们很容易的能写出高质量的代码,但是如果没有好的代码控制手段,用python也仍然能写出渣的代码,我甚至觉得因为其灵活性,可能会更容易写出烂的代码。这可以说是我们团队的教训。

这里,我并没有喷python的意思,它真的是一门好语言,我能够通过它快速的构建原型,验证我的想法,而且还一直在使用。只是在项目中,我们的一些疏忽,导致代码不可控了,到了不得不重构的地步了。

Why GO?

前面说了我的语言经历,以及项目到了重构地步的原因,但是为什么会是go呢?我们可以有很多其他的选择,譬如java,erlang,或者仍然采用python。我觉得有很多因素考量:

  • 静态,go是一门静态语言,有着强类型约束,所以我们不太可能出现在python中变量在运行时类型不匹配(譬如int + string)这样的runtime error。 在编译阶段就能够帮我们发现很多问题,不用等到运行时。(当然,这个静态语言都能做到)
  • 代码规范,很多人都比较反感go强制的编码规范,譬如花括号的位置。但我觉得,就因为强制约定,所以大家写出来的go代码样子都差不多,不用费心再去深究代码样式问题。而且我发现,因为规范统一,我很容易就能理解别人写的代码。
  • 库支持,go的库非常丰富,而且能通过go get非常方便的获取github,google code上面的第三方库(质量你自己得担着了),再不行,用go自己造轮子也是很方便的,而且造的轮子通常都比较稳定。
  • 开发迅速,不得不说,当你习惯用go开发之后,用go开发功能非常的快,相对于静态语言c++,开发的效率快的没话说,我觉得比python都不差,而且质量有保证。我们花了不到一个星期进行推送服务核心功能开发,到现在都没怎么变动,稳定运行。
  • 部署方便,因为是静态的,只需要build成一个可运行程序就可以了,部署的时候直接扔一个文件过去,不需要像python那样安装太多的依赖库。

GO特性

go现在的这个样子,有些人喜欢,有些人不喜欢,我无法知道为啥google那帮人把go设计成这样,但是我觉得,既然存在,就有道理,我只需要知道什么该用,什么不该用就可以了。

gc

GO提供了gc,这对于c++的童鞋来说,极大的减少了在内存上面犯错的机会,只是go的gc这个效率还真的不好恭维,比起java来说,还有很大的提升空间。

所以有时候写代码,我们还得根据tuning来提升gc的效率,譬如采用内存池的方式来管理大块的slice分配,采用no copy的方式来进行string,slice的互转。

不过go1.3貌似gc性能有了很大的改善,这点让我比较期待。

defer

go的defer其实是一个让人又爱又恨的东西,对于防止资源泄露,defer可是一个很不错的东西,但是滥用defer可是会让你面临很严重的内存问题,尤其是像下面的代码:

for {
    defer func(){
        //do somthing
    }
}

别以为go会在调用完成defer之后就好好的进行gc回收defer里面的东西,在我们进行内存profile的时候,发现大量的内存占用都是defer引起的。所以使用起来需要特别谨慎。

但我觉得,这个go应该会稍微改善,在go1.3里面,也有了对defer的优化。

error

也许error是一个让人争议很大的东西,现代方式的exception那里去呢?但是我觉得error能够非常明确的告诉使用者该函数会有错误返回,如果使用exception,除非文档足够详细,我还真不知道哪里就会蹦出一个异常了。

只是,go又提供了类似exception的defer,panic,recover,这是要闹哪出。

其实这篇文章我觉得已经解释的很好了,go程序的惯例是对外的API使用error,而内部错误处理可以用defer,recover和panic来简化流程。

其实这倒跟我一贯的编程准则对应,在团队在用python进行开发的时候,我们都明确要求库对外提供的API需要使用返回值来表示错误,而在内部可以使用try,catch异常机制。

interface

go提供了interface来进行抽象编程。何谓接口,最通常的例子就是鸭子的故事,“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子“。

在go里面,interface就是一堆方法的集合,如果某个对象实现了这些方法,那么该对象可以就算是该interface。使用interface,我们可以很方便的实现非侵入式编程,进行模块功能的替换。

对于长时间沉浸c++和python的童鞋来说,一下子要用interface来解决抽象问题,可能会很不适应。但当习惯之后,你会发现,其实interface非常的灵活方便。

写到后面

在使用的时候,我们需要知道go到底适用在什么地方,譬如我们现在也就将API服务使用go重构,我们可没傻到用go去替换openresty。

总之,go是一门很新的语言,国内也已经有很多公司开始吃这个螃蟹,也有成功的例子了,而我们也正开始了这段旅程。

我为什么选择go语言,码迷,mamicode.com

时间: 2024-10-10 17:26:06

我为什么选择go语言的相关文章

C语言博客(2)为什么选择C语言入门?

相信大部分的程序员都是会写一些C语言的,首先接触的也可能是C.可说到底为什么要从C语言开始学编程呢,为什么把C语言作为编程基础呢.是因为C语言除了能让你了解编程的相关概念,带你走进编程的大门,还能让你明白程序的运行原理,比如,计算机的各个部件是如何交互的,程序在内存中是一种怎样的状态,操作系统和用户程序之间有着怎样的"爱恨情仇",这些底层知识决定了你的发展高度,也决定了你的职业生涯. 所以如果你想在程序猿这条路上走得远,走向更高处,那么编程基础就一定要打好.所以可以从C语言入门开始学习

人工智能为什么选择Python语言?

作为新手,在面对广泛应用于企业级应用开发的 Java.游戏客户端开发的 C++.嵌入式开发的 C.人工智能领域的 Python 等数百种编程语言时,你会如何选择自己的第一门编程语言? 作者 | JACE HARR 译者 | 姜松浩 责编 | 屠敏 出品 | CSDN(ID:CSDNNews) 以下为译文: 刚入行的程序员总是询问他们应该从哪种语言开始,我告诉他们,他们应该首先学习 Python.以下是使用 Python 开始自学编程去探险的一些原因! 1.它应用广泛,可用于各种领域. Pytho

Android为什么选择Java作为开发语言之我见

我们先来看一组数据: 根据调研机构Strategy Analytics的最新统计数据,2014第三季度,iOS和Android已经占据全球首能手机96%的市场份额. 其中,Android依然是绝对的霸主,豪取83.6%,而且相比去年同期又增长了3个百分点,iOS占比为12.3%,同比下降1.1个百分点,差距还是很明显的.接着就是Windows Phone,目前占比4.1%,小幅增长,而黑莓系统已经只剩下可怜的0.7%.其它操作系统合计0.1%. 毫无疑问,iOS.Android已经成为这个世界上

聊聊C++语言-软件和编程

C++语言脱胎于C语言,早期还有好几个名字呢,什么"c with class", "new c"等等.可见其是一种基于C语言发展而来的更高级的语言,与C语言相比,她能做的事情更多,也更方便.在软件规模越来越大.复杂度越来越高的今天,尤其有必要学习C++语言.小编接下来将要写一个系列的文章来带你进入C++语言编程的奇妙世界. 首先聊聊什么是软件? 软件简单来说就是程序和文档,我们用一种语言告诉计算机要做什么事情--编写程序让计算机去处理,我们为自己设计的程序编写一些描

主流脚本语言的比较和选择

主流脚本语言的比较和选择 —— Hywhy 过去这一年的时间里,我买了不少书,查了很多资料,可以算是认真的学习了几种主流的脚本 语言,因为我一直想搞一个好用的自动化工具,来方便我们的系统维护.虽然这个愿望还没有达成,但是在这个过程中,还是学到了很多东西.今天下午,跟同事们 聊天时,说到了脚本语言,这是比较难得的,也正好借这个契机,把我的一些看法说一说,有不妥和错误的地方,请大家多指正. 为什么选择脚本语言 为什么选择脚本语言,可能每个人面对的实际情况都不一样.语言本身没有好坏之分,只有合适或者不

数据分析与R语言研讨班

为满足广大科研工作者在文章发表中遇到的图表处理的苦恼,让您真正了解R.使用R,给您的文章添色添彩,思数云bihadoop将于2014年11月15日举办<数据分析与R语言>研讨班,从基础入手结合实战完成您的高级制图需求.欢迎报名参加!!!!!! 主办单位:思数云服务中心 举办地:北京,北京市回龙观龙冠大厦 培训时间:第五期2014年11月1日(已结束) 第六期:2014年11月15日(报名中...) 报名截止:2014年11月11日 授课内容(部分) 等级 授课题目 授课内容 基础 R语言基础知

听说你们要开始学C了

同学们好: 先自我介绍一下,我是你们的助教吴喆(厚颜无耻地要求大家叫我吉吉老师:-D),本科学的电子,所以陆陆续续接触了不少C/C++的工作,曾经被编码折磨得死去活来,如今却对其念念不舍,颇有点“斯德哥摩尔综合征”的味道,或许,我就是个受虐狂吧,哈哈(不禁想起三国杀里的黄盖对周瑜说的话——请鞭笞我吧,公瑾!). 大学学习过程中还是走了不少弯路的,而且还有些弯路是“致命的”,当时也并不是无人点拨,只可惜我一根筋,听不进相左意见,直到撞了南墙才肯回头认错,痛改前非,现在在外工作,方知踏实学习之珍贵,

Node第一张

第一张主要内容有: Node 的诞生历程 Node的命名和起源 为什么选择javascript语言 为什么叫Node Node给javascript带来的意义 Node的特点: 异步I/O 事件和回调函数 单线程 跨平台 Node的应用场景 I/O密集型 cpu密集型业务 与遗留系统的和平共处 分布式应用 Node的使用者 前后端编程语言环境统一 Node带来的高性能I/O用于实时应用 并行I/O使得使用者可以更高效的利用分布式环境 并行I/O,有效利用稳定接口提升Web渲染能力 云计算平台提供

面向过程(面向结构)与面向对象的区别

script"> var username = "qq_31108501"; var _blogger = username; var blog_address = "http://blog.csdn.net/qq_31108501"; var static_host = "http://static.blog.csdn.net"; var currentUserName = ""; var fileName