在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
如果是入门级的中文文档资料,已经非常丰富,在google code上面有专门的翻译小组,CSDN也有中文手册下载,相关中文书籍也有出版。这里有免费的https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/preface.md
http://www.mikespook.com/learning-go/ ------------------------------------------------------------------ http://www.oschina.net/translate/migrating-code-from-python-to-golang-what-you-need-to-know
=========================================== http://www.mikespook.com/2011/02/%E7%BF%BB%E8%AF%91go-%E5%92%8C-python-%E7%9A%84-web-%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%80%A7%E8%83%BD%E5%AF%B9%E6%AF%94/ 原文在此:http://ziutek.github.com/web_bench/ 由于是早上看到 鱼哥,在推上的推荐,我实在忍不住……这是中午的草率之举,所以鱼哥 对本文的翻译负全责。 PS:别说我工作状态不饱满,我在等丫的程序执行完…… ————翻译分割线———— Go 和 Python Web 服务器性能对比我通常使用 Python 来构建 Web 应用。一年前,在兴趣的驱使下,我开始学习 Go。 在此期间,我重写了一些原本由 C 开发的 CGI 应用,包括运行于 chroot 环境下的同thttpd 服务器一起的应用。我开始寻找可以开发易于 chroot、且内置 Web 服务器的独立 Web 应用的工具。那时,我开始玩 web.go 框架、mustache.go 模板、Go 原生 http 包和 GoMySQL 数据库 API。我发现,有 http、mustache.go GoMySQL 包的 Go 可以是我用来工作的不错的工具组合。因此,我决定使用 Go 编写我的应用。
和下面的 Python Web服务器/框架:
每一个用例,我都编写了一个小应用,略微复杂一些的、传统的 Hello World 例子。任何应用都包括:
我想,这些都是在 Web 应用中常见的操作,所以应当包含在任何简易的性能对比测试中。所有测试应用的代码在下面的链接中: 测试环境测试环境包括两台 使用千兆以太网链接的PC (请求发起者和应用服务器)。
为了产生 HTTP 请求并且评估测试应用的性能,我使用 siege 性能测试工具。Siege 可以用多线程模拟多个用户。我使用了下面的命令产生请求:
或者多个类似的命令,减少参数 -c 的量(在这个测试中,我同时运行了多个 Python 脚本)。它模拟了 200 用户的请求,并持续 20 秒。这个 URL 使得 Web 应用对每个请求都输出 100 行。Go 应用使用 Go 发布版 2011-02-01.1。 结果GOMAXPROCS=1, 一个 Python 进程:
GOMAXPROCS=2, 两个 Python 并发进程:
GOMAXPROCS=4, 四个 Python 并发进程:
Web.py+nginx 工作的 flup FastCGI 选项:multiplexed=False, multithreaded=False。如果 multiplexed=True 它会运行得慢一些。如果 multithreaded=True 而只有一个进程服务于 nginx 服务器,会报下面的错误:
FastCGI 的多进程由 spawn-fcgi 产生。 结论你可以看到 Go 赢得了几乎所有的测试用例。web.go 框架的那个不太理想的结果可能是由于它先尝试用指定的 URL 寻找静态页面,然后才会执行处理方法。让我惊讶的是 tornado Python 框架如此之高的性能,尤其是跟 web.py 框架相比而言。我同样对 CherryPy 服务器比 nginx+flup 快感到惊讶 (我使用 web.py+flup+nginx 跑几乎所有的 Python Web 应用)。
============================================= http://tonychee1989.diandian.com/Python-C-Go-test 数学上有个关于圆周率的近似值计算公式:
后面多项式的值越多,最终的结果就越精确,于是,我写了3个程序:
另外,为便于测试,我同时还写了一个shell脚本:
那么,接下来,就应该进行测试了,我想看看这三种语言执行效率怎样: 在终端输入命令:
最后,打开生成的report文件:
图表的形式会直观一些:
从图中能看到:
最后再吐槽一下,Go语言为什么没有问号运算符啊?难道是因为追求可读性给去掉了??!! =================================== http://blog.jobbole.com/14386/ 最近在忙一个Server+Client的项目,Client是Android手机,大概也就是几十的规模。Server是纯Go语言实现,没有apache或者ngix这种web server,也没有数据库,自己写了个文件管理module,处理这种小规模的服务没问题。算下来接触Go语言也有四个多月了,断断续续写了一些东西,这里记录一下心得吧。 先大概说下为什么用Go语言。我是一个对语言有洁癖的人,曾经是一个c+Python的坚定呐喊者,最常说的一句话就是,只要熟练这两种,什么情况都能应付,根本不用Java和C++(纯指我所在的领域)。核心代码用c,速度快,需要记的语言细节少;外围用Python glue,灵活,简洁,任何模块都容易上手,绝配。Java的繁琐,C++的无数无用的特性,都让我只在不得不用的时候才去用。Objective-C是另一个我欣赏的语言,问题是不跨平台,过于封闭。 可惜的是,在这个节奏极快的时代,不是所有情况下都适合上c。之前有一个项目也是类似的架构和规模,为了节省时间,当初几乎没有服务器平台编程经验的我,在服务器端选择用Django、Apache、MySQL做,成熟,社区活跃,又是python作为主要开发语言,这些都是这个选择的原因。说实话,几个月过去后,回首看,这不是一个愉快的经历。Django是一个好架构,大而全,而大而全有时也就意味着臃肿,五花八门的配置,过紧的模块耦合对引入第三方工具限制颇多,自带的ORM又不好用。之前从来没有搞过服务器配置的我,对Apache的配置和效率所带来的琐碎的东西也头疼。总的来说这个部分花了我很多时间,有新手学习服务器编程的必经过程,也有折腾Django和Apache没必要的时间浪费,很大部分上抵消了Python带来的快速开发的灵活性。而一旦服务器上线,动态语言带来的一些bug又会让人头疼。对于普通高校实验室这种没有完善的服务器调试的条件,基本就是改了就上线用,有些隐蔽bug到某些条件分支才会触发,一旦在运行中途出问题,改起来也麻烦。 从那时起,我就特别想,要是有一种语言能把c和Python的优点结合起来,也就是说 ▲速度快,高性能 ▲简洁明了,需要记的语言细节少,开发迅速(c) ▲灵活,开发快速,类Python的list,map等常用数据结构支持(Python) ▲完善的模块支持,模块也容易上手(Python) ▲对程序员友好的并行架构(Erlang) ▲安全,绝大部分问题能消灭在compile time中(C minus pointer) 那基本就是系统级和网络级编程最对我胃口的语言了。然后我就找到了Go。 Go语言是一个新语言,截至目前为止,第一版正式版还没有发布。Go语言的设计者是Robert Griesemer, Rob Pike和Ken Thompson,当年设计C和Unix,后来的Plan9团队中的人 。Go语言的设计理念很明确,就是将动态类型语言的编程容易度和静态类型语言的安全效率结合起来。如果你想更深入了解Go语言的发展历史以及完整的目标,请参考Go语言 FAQ。 当然,Go语言吸引我的地方,不是因为其是Google出品,也不是因为其设计者皆为大牛,而是因为,Go语言真的做到了它所宣称的目标。Go语言就如同C和Python中间的完美结合,如果你是Python爱好者,又追求代码的速度和并行化,那么简单说,Go语言就是为你设计的。Go语言有很浓厚的C的遗风,尽量屏蔽C++和Java的影响,比如没有独立的OO体系(并不是说不能OO),一切以struct为中心,没有exceptions(Oh yes!),仍然有指针,等等。但是,Go语言又吸取了很多新语言的精华,并带有自己独特的设计。比如 1. 保留但大幅度简化指针 Go语言保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在Go语言中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。 2. 多参数返回 还记得在C里面为了回馈多个参数,不得不开辟几段指针传到目标函数中让其操作么?在Go里面这是完全不必要的。而且多参数的支持让Go无需使用繁琐的exceptions体系,一个函数可以返回期待的返回值加上error,调用函数后立刻处理错误信息,清晰明了。 3. Array,slice,map等内置基本数据结构 如果你习惯了Python中简洁的list和dict操作,在Go语言中,你不会感到孤单。一切都是那么熟悉,而且更加高效。如果你是C++程序员,你会发现你又找到了STL的vector 和 map这对朋友。 4. Interface Go语言最让人赞叹不易的特性,就是interface的设计。任何数据结构,只要实现了interface所定义的函数,自动就implement了这个interface,没有像Java那样冗长的class申明,提供了灵活太多的设计度和OO抽象度,让你的代码也非常干净。千万不要以为你习惯了Java那种一条一条加implements的方式,感觉还行,等接口的设计越来越复杂的时候,无数Bug正在后面等着你。 同时,正因为如此,Go语言的interface可以用来表示任何generic的东西,比如一个空的interface,可以是string可以是int,可以是任何数据类型,因为这些数据类型都不需要实现任何函数,自然就满足空interface的定义了。加上Go语言的type assertion,可以提供一般动态语言才有的duck typing特性, 而仍然能在compile中捕捉明显的错误。 5. OO Go语言本质上不是面向对象语言,它还是过程化的。但是,在Go语言中, 你可以很轻易的做大部分你在别的OO语言中能做的事,用更简单清晰的逻辑。是的,在这里,不需要class,仍然可以继承,仍然可以多态,但是速度却快得多。因为本质上,OO在Go语言中,就是普通的struct操作。 6. Goroutine 这个几乎算是Go语言的招牌特性之一了,我也不想多提。如果你完全不了解Goroutine,那么你只需要知道,这玩意是超级轻量级的类似线程的东西,但通过它,你不需要复杂的线程操作锁操作,不需要care调度,就能玩转基本的并行程序。在Go语言里,触发一个routine和erlang spawn一样简单。基本上要掌握Go语言,以Goroutine和channel为核心的内存模型是必须要懂的。不过请放心,真的非常简单。 7. 更多现代的特性 和C比较,Go语言完全就是一门现代化语言,原生支持的Unicode, garbage collection, Closures(是的,和functional programming language类似), function是first class object,等等等等。 看到这里,你可能会发现,我用了很多轻易,简单,快速之类的形容词来形容Go语言的特点。我想说的是,一点都不夸张,连Go语言的入门学习到提高,都比别的语言门槛低太多太多。在大部分人都有C的背景的时代,对于Go语言,从入门到能够上手做项目,最多不过半个月。Go语言给人的感觉就是太直接了,什么都直接,读源代码直接,写自己的代码也直接。 有朋友要抗议了,你把Go语言吹的这么好,难道它就没有缺点?有,当然有,不过和它的优点比,我觉得很多缺点都是因为整个语言太新,不成熟,随着时间的推移都能得到解决,相比之下都能忍了。如果你希望进一步了解Go语言的优缺点,可以参考以下yufeng写的这篇文章,系统编程语言明日之星—Go(http://blog.yufeng.info/Go.pdf。 还有朋友要说,Go语言这么好,为什么没人用?我想说,眼界放开点,这个世界精彩的东西比你想象的多。Go语言被Google用于Youtube的数据库,被越来越多的国外公司(大部分创业公司)用于后端开发,甚至在天朝,也有完全用Go语言做服务开发的云应用公司了。可以说,随着Go 1即将到来的正式推出,Go语言的使用范围,应该会越来越广。 总结 如果你是Python和动态语言狂热爱好者,Go不一定能给你带来很大的惊喜,这纯粹取决于你得项目性质,考虑到Python目前在很多地方都用C做核心运算,速度在大部分情况下都不是大问题。scalability是一个问题,但并不是人人都会遇到的。 如果你是C爱好者,强烈建议你学习和使用Go。Go可以调用C/C++程序,又提供了太多的便利,速度上稍有牺牲,但并不大。在绝大部分场景下Go能给你带来媲美C的性能,而对于某些确实性能过于关键的场合,也可以通过cgo让Go和C搭配。 如果你是Java爱好者,除非你是做Android这种不得不用Java的平台,否则也建议你尝试学习Go,这个开发上感觉的差异如同比较开载着1吨石头的拖拉机和开保时捷911那么明显,而Java能给你的,Go能给得更好。 如果你是C++爱好者,!@#$%^&*,恭喜你,至少你的智商应该是没问题的。人生苦短,赶紧脱离C++这个苦海吧。你用来学89个C++高级特性的时间,估计已经用Go写了64个开源项目了。 如果你是像我一样的C和Python的爱好者,对动态语言又没有特殊的热爱……我还需要说什么呢? 让我们荡起双桨,去遨游Go语言的海洋吧。 ############################################### http://book.douban.com/review/5928325/ 过年在老家的时候不能上网,通过文档抽空学了下go语言。后来又买了这本书。总体上这本书是当前的 go语言书中比较不错的一本。但缺点在于对go的并行机制以及内存回收机制这两个非常重要的话题介绍的不够深入。go的并行机制是其最大的亮点go的存在基础,而内存回收机制更是是否能革c和java命的根基。 既然说到了这个书,当然也需要说说对go语言的看法。
================================================= http://www.cnblogs.com/AllenDang/archive/2012/03/03/2378534.html 从2000年至今,也写了11年代码了,期间用过VB、Delphi、C#、C++、Ruby、Python,一直在寻找一门符合自己心意和理念的语言。我很在意写代码时的手感和执行的效率,所以在Go出现之前一直没有找到。在熟悉Go之后,我虽没有停下脚步,也去体验了D语言,但几乎立即就放弃了,它的设计还是太复杂。 就说说Go吧。它的好其实也就两个字——简洁!
看很多朋友的留言都觉得这些“少个括号、少个分号”之类的东西没什么意义,真的吗?问题是,既然可以没有,为什么非得有?既然能够少打一个字符,为什么多打了还挺开心?还觉得天经地义?这里简单一点,那里简单一点,总的来说是不是就简单了很多?这里的设计简洁一点,那里简洁一点,是否整体就是紧凑高效? 很多东西,要整体去体会,才能感觉到真正的强大。没有前面这些语法上的各种“看起来没什么用”的支持,怎么能做到后面提到的那些设计上的简洁?
我坚信,少就是多,简单就是强大,不能减一分的设计才是真正的好设计!
简洁的变量声明和赋值 拿最简单的声明变量和赋值来看,下面这一句完成了声明类型到赋值,最后还有那个常见的分号作为语句的结束。 var i int = 10; 这个一点都不简洁对吧?为什么非要有“var”?为什么不能自己推导变量类型?为什么结尾非要加上分号?这三个问题,我相信Go语言的设计者也问过,并且都针对性的给了改进。重新来过。 i := 10 怎么样?“:=”是声明并推导类型的语法糖,结尾的分号也省了,因为这里我换行了,编译器明白的。 还可以一次性声明并赋值多个变量。 i, j, k := 1, 2, 3 不同的类型也可以。 i, j, k := 1, 1.0, “hello” 如果要声明一堆变量,但暂时不赋值呢?可以这样。 var ( i, j int
s string
u, v, s = 2.0, 3.0, "bar"
) Go的设计者甚至觉得多打几个“var”都不应该!
简洁的if 有点意思了对吧?我学习一门新语言的时候,第一眼看变量类型和声明,第二眼就会去看逻辑控制的语法。现在来看看都有些什么? if i > 10 { println(“Greater then 10”) } 稀松平常啊,难道一个简单的if还能更简单?恩,的确是的。首先if后面的条件判断没有人逼你再加上括号了,仅仅是少了两次按键嘛,还有呢?还有!下面这个应该是很常见的if使用场景。 result := SomeMethod() if result > 0 { } 很多时候result这个变量其实仅仅用于条件判断,完全可以在if之后就扔掉,所以Go有了这么个写法。 if result := SomeMethod(); result > 0 { } 这个表达式太常用了,真是谁写谁知道,每次我写着一行都会心里一爽。来看看纠结一点的if段。 if a { } else if b { } else if c { } else { } 这种写法是可以的,但不是Go推荐的,理由是可以更简洁。比如强悍的switch。
强悍的switch 这是很大家熟知的switch用法,注意,没有break哦!Go里面case之间不会“下穿”。 switch tag {
default:
s3()
case 0, 1, 2, 3:
s1()
case 4, 5, 6, 7:
s2()
}
神奇一点的switch,嘿嘿,与if异曲同工之妙。
switch x := f(); { // missing switch expression means "true"
case x < 0: return -x
default: return x
}
还有这个,有了这个更加明确的写法,你真的还会if…else if…else if…else…吗? switch {
case x < y: f1()
case x < z: f2()
case x == 4: f3()
}
条件判断舒服了,循环呢?
孤单的f |
请发表评论