为什么我不会舍弃python学习资料投奔Go语言 –

本文来自: ,转载请保留出处!
本文链接: go python_go语言 python_
手机配件资讯导航CSDN刘江评价:说C++擅长的Go还是不行,而Python擅长的,Go还可以且性能足够。请问Go语言和Python、C++相比到底有什么优势?
该问题被发起重新开启投票
投票剩余时间:
之前被关闭原因:
该问题被发起删除投票
投票剩余时间:
距离悬赏到期还有:
参与关闭投票者:
关闭原因:
该问题已经被锁定
锁定原因:()
保护原因:避免来自新用户不合宜或无意义的致谢、跟帖答案。
该问题已成功删除,仅对您可见,其他人不能够查看。
所谓&C++擅长的Go还是不行&,是因为Go还很年轻,其生态环境还不够完善。用Go编码来调用系统级C库是非常非常方便的。
Go相对于C++的优势我认为是其先进性、规范性和简单性。
Go相对于Python的优势我认为是其性能、语法和工程特性。
接触GO一个多月,理解有限,轻拍。从实际应用说一下,做了两个东西,一个是解析xml然后把相关信息放到数据库查询,在解析xml方面非常方便简单,有goweb包,对web处理非常简单。使用goweb.Maprest()函数。另一个是跑在网关上,接收传感器信号,然后转换信息,发送平台上的小程序。主要利用socket通讯和多线程,GO有专门的chan 类型,用于管道通信。线程的支持更简单,GO function()这一句语句就开启了function对应的线程。GO把C++的面向对象整合到struct里,所有对象都是结构,结构也可以派生,比如B要继承A type
A struct{a int}type
B struct {A}//注意A没有赋变量同样,结构的派生会继承方法和成员函数。GO的接口类似于JAVA的interface,也类似于C++的抽象类,接口内只能定义方法。想想吧,结构的继承加上接口,可以做基础的面向对象了。GO的结构非常清晰,package的使用,大小写区分public和private,简单明了。这段时间用GO写的很开心。
1:Golang开发的初衷是为了替代繁琐的C++做系统编程的。简单,轻量级,少即是多。目前看来,python和ruby的程序员更喜欢它。2:Golang是编译语言,python是解释性语言。在运行效率上golang&python。在开发效率上golang=python。这也是python程序员喜欢golang的原因,相比熟悉的python并没有失去什么,但是获得了更高的运行效率。3:在运行效率上golang想比c++还是有一定差距的。但是开发效率上c++和golang不是一个量级的。4:个人认为golang会逐渐取代java的位置。
golang,py,cpp根本没有可比性。golang,py都不是C系语言。语法与运行时技术都不相同。所服务的是本地平台还是虚拟平台都不相同。若你拿gcc,vstudio cpp,qt cpp相比还有得一说。至少要工作在同一语言规范下(gcc,microsoft cpp),或同一套编译器下(qt cpp vs legay cpp)。
我的建议:
学语言不如学C系语言。学C系语言不如学qt cpp。它才是one language for all。它的语言是基于signal / slot的,可以模拟多种抽象惯用法,多种设计模式,多种应用框架,与多种系统应用逻辑,或web应用逻辑进行设计上的一一对应。。即,它足够generic,用一种典范代替传统cpp的多典范。
私以为:cpp的多典范,从提出来就是错的。
编程的根本在于抽象方案和应用方案的不断整合向一,最高境界是轻适抽象,保核向用。--------- 轻量但不要过度抽象,保持一个面向应用的最小工业和教育核心。
仅仅语言语法、语言特性这个层次的优势不大。
go erlang这些语言相对其他语言的优势,在于go erlang这样的语言,不仅仅是一个语言,而是一个操作系统,它定义了自己的任务概念,实现了任务调度管理,使我们的程序可以在多核甚至分布式环境具备很好的伸缩性。
你不需要关心有几个核几个CPU,你的程序在2个CPU的系统上就会启动2个线程(OS级别)运行,8个CPU就8个,始终有很好的多核并发能力,充分利用系统资源。这才是这些语言的最大优势所在。
我是C++程序员,用go写过几个小程序,说下我对go和C++区别的看法:1.完善的库,这个对于C++程序员来说是很需要的,包括json,html库等等
2.并发的支持,如果是C++写程序,一旦设计到多线程肯定会搞死人,包括数据通讯,线程通讯,编程模式,这些都是C++代码膨胀的原因,但是在go里面没有这个问题,-&和go routine可以很好的解决这些问题
3.不完善的编译器,因为go还没办法替代所有C/C++的工作,所以在编程的时候需要用到C/C++的地方你只能用Cgo去嵌入,也就是把C代码写在go里面,这样又是搞死人的设定,如果是python,可以把python的代码独立出来,但go没办法,你只能把代码写在go的代码里面
4.垃圾回收,这个对于C/C++程序员真心是福音,当然前提是要不保证内存大量泄露,小量的泄露大多数人还是能接受的
PS:今天我们组的一个程序员写一个结构体,总共有将近100+个数据,要全部写入XML,只能一行一行代码的写,现在写了差不多有200+行了,但是如果用GO的json模块,只需要2行左右,当然格式是json的,不过我觉得json比xml好多了
都有优势!python简单
现在评论go还太早,刚出来简洁,越变越臃肿的例子太多了
接触GO有三四个月了,用到最多的就是goroutine,另外代码风格比原来也好了一些,大概是因为GO严格要求规范吧。GO应该算是一门很年轻的语言,还有很多可以优化的部分吧。编译器方面,调试的功能还远远无法与eclipse相比,调试时候比较费事,其他时候感觉编程还是很方便的
还是C++ 在钱途方面,比较有优势
对服务器编程来说,一个最直接的变化就代码逻辑简单很多。可以直接用同步阻塞的方式写逻辑,代码结构非常的清晰简洁,少了很多异步调用和状态处理,也相应减少了很多不必要的代码量。大约估计:200行C++代码,用go只要100行就搞定。
刚刚学习Golang, 感觉很新颖, 就和这个新房子一样, 还有很多地方需要优化, 不过可以肯定的是Golang很强, 有Python的灵活性和C的性能
Go很多不成熟,Google都只限于内部一些项目的开发。C++已经非常成熟C++11以后C++将继续发展。
看是用在什么地方吧,底层操作,只有C++与ddk结合才是正道,其它语言就没一个是好用的
主要就是更简便 特别是并发编程一块 目前我也在学~~
Go语言因为晚出来,所以综合了c++,python等的优势, 这里有一篇介绍Go的,你可以看看: 官网:
以前用python写一个程序快是挺快的,啪啪啪就完成了,但是想使得这个程序充分利用多个cpu核心,提高性能,能做的就是开启多个进程,然后想办法添置进程同步的函数进行处理,当然也可以利用现有框架,而go语言在保留python的快速开发能力的同时,非常方便的解决了这个问题,并且提供了编译步骤,可以在快速编译期,非常友好的提示错误在哪儿,不是像python那样,某个逻辑分支没有运行到,你很难发现一些基本错误。对于C++来说,go补充了一个快速开发多线程程序的方案,在c++中使用指针,必须小心的包装智能指针进行和弱引用来保证线程与指针析构之间的先后顺序,而go显然更灵活的做到这一点,并且将异步,通知的方案直接嵌入到了I/O层,与他自己的goroutine调度器进行了结合,非常方便开发i/o相关的程序。另外在文本处理方面也有线程的优良库,方便的结合github的安装第三方库方案,这些现代的新方案确实要比c++老迈的发展步伐更让人眼前一亮。最后go语言能做到什么,我个人觉得多线程、重度i/o,快速开发是他的标签。另外,新语言提供的新思路,肯定会提高包括C++/python在内各种语言发展的步伐。
不是您所需,查看更多相关问题与答案
德问是一个专业的编程问答社区,请
后再提交答案
关注该问题的人
共被浏览 (29167) 次Python开发者在转到Go语言之前需要了解什么? - 文章 - 伯乐在线
& Python开发者在转到Go语言之前需要了解什么?
【感谢张佳伟()的热心翻译。如果其他朋友也有不错的原创或译文,可以尝试。】
这是一篇(长)博文, 介绍了我们在 Repustate 迁移大量 Python/Cython 代码到 Go 语言的经验。如果你想了解整个故事,背景和所有的事情,请继续往下读。如果你只是想了解 Python 开发者在一头扎进 Go 语言前需要了解什么,请点击一下链接:
在 Repustate,我们完成过的最棒的技术成就之一是实现了阿拉伯语的情感分析。阿拉伯语是一块难啃的硬骨头,因为它的词形变化相当复杂。比起譬如英语,阿拉伯语的分词(将一个句子切分呈几个独立的单词)也更困难,因为阿拉伯语的单词本身还可能会包含空白字符(例如:“阿列夫”在一个单词里的位置)。这也谈不上是泄密,Repustate 使用支持向量机(SVM)来获取一个句子背后最有可能的含义,并在其中加上情感元素。 总体上来说,我们使用了 22 种模型(22 个 SVM) 并且在一篇文档中,每一个单词我们都会加以分析。因此如果你有一篇 500 字的文档,那么基于 SVM,会进行十万次的比较。
Repustate 几乎完全就是一个 Python 商店。我们使用 Django 来实现 API 和网站。因此(目前)为了保持代码一致,同时使用 Python 来实现阿拉伯语情感引擎是合情合理的。只是做原型和实现的话,Python 是很好的选择。它的表达能力很强悍,第三方类库等等也很好。如果你就是为了Web服务,Python 很完美。但是当你进行低级别的计算,大量依赖于哈希表(Python 里的字典类型)做比较的时候,一切都变慢了。我们每秒能处理大约两到三个阿拉伯文档,但是这太慢了。比较下来,我们的英语情感引擎每秒能处理大约五百份文档。
因此我们开启了 Python 分析器,开始调查是什么地方用了那么长时间。还记得我前面说过我们有 22 个 SVM 并且每个单词都需要经过处理吗?好吧,这些都是线性处理的,非并行处理。所以我们的第一反应是把线性处理改成 map/reduce 那样的操作。简单来说:Python 不太适合用作 map/reduce。当你需要并发的时候,Python 算上好用。在 2013 Python 大会上(译者:PyCon 2013),Guido 谈到了 Tulip,他的这个新项目正在弥补 Python 这方面的不足,不过得过段一段时间才能推出,但是如果已经有了更好用的东西,我们为什么还要等呢?
选 Go 语言,还是回家算了?
我在Mozilla的朋友告诉我,Mozilla 内部正在将他们大量的基础日志架构切换到 Go 语言上,部分原因是因为强大的 []。Go 语言是 Google 的人设计的,并且在设计之初就把支持并发作为第一要务,而不是像 Python 的各种解决方案那样是事后才加上去的。因此我们开始着手把 Python 换成 Go 语言。
虽然 Go 代码还不算正式上线的产品,但是结果非常令人鼓舞。我们现在能做到每秒处理一千份文档,使用更少的内存,还不用调试你在 Python 里遇到:丑陋的多进程/gevent/“为什么 Control-C 杀不了进程”这些问题。
为什么我们喜欢 Go 语言
任何人,对编程语言是如何工作(解释型 vs 编译型, 动态语言 vs 静态语言)有一点理解的话,会说,“切,当然 Go 语言会更快”。是的,我们也可以用 Java 把所有的东西重写一遍,也能看到类似更快的改善,但那不是 Go 语言胜出的原因。你用 Go 写的代码好像就是对的。我搞不清楚到底是怎么回事,但是一旦代码被编译了(编译速度很快),你就会觉得这代码能工作(不只是跑起来不会错,而且甚至逻辑上也是对的)。我知道,这听上去不太靠谱,但是确实如此。这和 Python 在冗余(或非冗余)方面非常类似,它把函数作为第一目标,因此函数编程会很容易想明白。而且当然,go 线程和通道让你的生活更容易,你可以得到静态类型带来的性能大提升,还能更精细的控制内存分配,而你却不必为此在语言表达力上付出太多的代价。
希望能早点知道的事情(Tips & Tricks)
除去所有这些赞美之词以后,有时你真的需要在处理 Go 代码的时候,相对于 Python,改变一下思维方式。因此这是我在迁移代码时记录的笔记清单 —— 只是在我把 Python 代码转换到 Go 时从我脑子里随机冒出来的点子:
没有内建的集合类型(必须使用map,并检查是否存在)
因为没有集合,必须自己写交集,并集之类的方法
没有 tuples 类型,必须写你自己的结构,或者使用 slices (即数组)
没有类似 \__getattr__() 的方法,你必须总是检查存在性,而不是设置默认值,例如,在 Python 里,你可以这样写 value = dict.get(“a_key”, “default_value”)
必须总是检查错误(或者显式的忽略错误)
不能有变量/包没被使用,因此简单的测试也需要有时注掉一些代码
在 [] byte 和 string 之间转换。 regexp 使用 [] byte (不可变)。这是对的,但是老把一些变量转换来转换去很烦人
Python 更宽松。你可以使用超出范围的索引在字符串里取一个片段,而且不会出错。你还可以用负数取出片段,但是 Go 不行
你不能混合数据结构类型。也许这样也不太干净,但是有时在 Python 里,我会使用值是混合了字符串和列表的字典。但是 Go 不行,你不得不清理干净你的数据结构或者使用自定义的结构
不能解包一个 tuple 或者 list 到几个不同的变量(例如:x, y, z = [1, 2, 3])
驼峰式命名风格(如果你没有首字大写方法名/结构名,他们不会被暴露给其它的包)。我更喜欢 Python 的小写字母加下划线命名风格。
必须显式检查是否有错误 != nil, 不像在 Python 里,许多类型可以像 bool 那样检查 (0, “”, None 都可以被解释成 “非” 集合)
文档在一些模块上太散乱了,例如(crypto/md5),但是 IRC 上的 go-nuts 很好用,提供了巨大的帮助。
从数字到字符串的转换(int64 -& string) 和 []byte -& string (只要使用 string([]byte))不太一样。需要使用 strconv。
阅读 Go 代码比起 Python 那样写起来如伪代码的语言更像一门编程语言, Go 有更多的非字母数字字符,并且使用 || 和 &&, 而不是 “or”和“and”
写一个文件的话,有 File.Write([]byte) 和 File.WriteString(string), 这点和 Python 开发者的 Python 之道:“解决问题就一种方法 ”相违背。
修改字符串很困难,必须经常重排 fmt.Sprintf
没有构造函数,因此惯用法是创建 NewType() 方法来返回你要的结构
Else (或者 else if)必须正确格式化,else 得和 if 配对的大括号在同一行。奇怪。
赋值运算符取决于在函数内还是函数外,例如,= 和 :=
如果我只想要“键”或者只想要 “值”,譬如: dict.keys() 或者 dict.values(),或者一个 tuples 的列表,例如:dict.items(),在 Go 语言里没有等价的东西,你只能自己枚举 map 来构造你的列表类型
我有时使用一种习惯用法:构造一个值是函数的字典类型,我想通过给定的键值调用这些函数,你在 Go 里可以做到,但是所有的函数必须接受,返回相同的东西,例如:相同的方法签名
如果你使用 JSON 并且 你的 JSON 是一个复合类型,恭喜你。 你必须构造自定义的结构匹配 JSON 块里的格式,然后把原始 JSON 解析到你自定义结构的实例中去。比起 Python 世界里 object = json.loads(json_blob) 要做更多的工作
是不是值得?
值得,一百万倍的值得。速度的提升太多了,以致很难舍弃。同时,我认为, Go 是目前趋势所在,因此在招新员工的时候,我认为把 Go 当作 Repustate 技术积累的重要一环会很有帮助。
关于作者:
可能感兴趣的话题
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2018 伯乐在线F#是一个基于.NET框架的多模式编程语言、是一种.NET平台上的函数式编程语言、更是一个高效的.NET程序语言.就像C#和VB.NET,F#可以利用.NET的核心类库,如WPF,WCF,VSTO等等,通过F#您甚至可以使用XNA编写XBox游戏.仅仅如此并不意味着您应该去学习它.那为何要使用F#呢?
作为一种函数式编程语言,F#使得某些领域的编程要比命令式编程(如使用C#)更为容易.并行编程(Parallel Programming)和面向语言编程(Language-Oriented Programming)是其中的两个领域.
F#语言交互式设计窗口
如果您曾经编写过.NET应用程序,并感觉自己在努力使用手头的语言表达自己的想法,也许F#就是您在寻找的.F#主要是由Microsoft Research 和 Visual Studio 小组协作开发的,并采纳了F#社区和一些主要使用者的意见.F#为Visual Studio 2010带来了很大的改观.
因为替代了局部程序中的元组使工作变的简单了.在异步编程和强类型对于浮点编码方面也提供的不错的解决方式.可以说F# 是Visual Studio 2010中结合了众多优点的编程语言.
在F#中函数可以被视为值,可以传递给其他函数,你可以方便地编写高阶函数;
F#支持组合式编程,你可以通过使用简单的操作符语法来组合函数;
F#提供了支持函数式编程风格的类型,如针对简单数据集合的元组和针对结构化符号数据的discriminated unions;
F#提供了许多不可变的数据结构,如不可变的列表、映射、集合、序列和记录等;F#支持异步编程,并且提供了使这种编程比以往更容易的结构;
Visual F#中还包括了一个F#解释器,F#互动器(fsi.exe),它能够以交互方式编译并执行代码;F#支持延迟计算,这可以使您直到需要结果时才进行计算;
F#支持面向对象语言特征,除了让您使用F#语言开发.NET框架API外,这种特征可以使F#程序能够充分地访问.NET框架.
当然除此以外,F#还支持如面向对象语言特征,支持命令式编程结构,支持数学计算等特性.在VS2010中F#除了特征广泛外,它的特点还包括比如说简单简洁的句法、并行和异步的编程.
F#简单简洁的句法:
F#像C#一样,是一种强制型的语言.但是我也可以使用类似在Python中那样的方式.既轻量级的,灵活的,数学类的编程方式.
let data = (1,2,3)
let rotations (x, y, z) =
[ (x, y, z);
(z, x, y);
(y, z, x) ]
let derivative f x =
let p1 = f (x - 0.05)
let p2 = f (x + 0.05)
(p2 - p1) / 0.1
let f x = 2.0*x*x - 6.0*x + 3.0
let df = derivative f
System.Console.WriteLine("The derivative of f at x=4 is {0}", df 4.0)
其运行结果为:“The derivative of f at x=4 is 10”.
在并行和异步编程上,.NET Framework 4 和Visual Studio 2010中,包含了一个关于并行程序开发的庞大文档和工具库.F#提供了一种强健的编程模式和灵活优秀的功能,使这些显现的更为直观.最为重要的是,我们可以在过去习惯了的线性编程模式下进行异步编程.
let http url =
async { let req = WebRequest.Create(Uri url)
let! resp = req.AsyncGetResponse()
let stream = resp.GetResponseStream()
let reader = new StreamReader(stream)
let! contents = reader.AsyncReadToEnd()
return contents }
let sites = ["h ttp://bing.com"; "h ttp://microsoft.com";"h ttp://msdn.com"; "ht tp://msnbc.com"]
let htmlOfSites =
Async.Parallel [for site in sites -& http(site)]
|& Async.RunSynchronously
以上就是Visual Studio 2010中F#语言简单介绍,在使用过程中肯定会有更多的体验.
随著FP在程序设计中的重要性日渐凸显,F#身为微软唯一的FP语言,其位置特殊,容易引起关注。对一部分人来说,这语言所带来的一些特性以及其对FP的特性的全面支持(而且做得都比较好,至少目前是这样),可能会带来一次大的革变。
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至: 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。
使用Node做前后端分离的开发模式带来了一些性能及开发流程上的优势(见《前后端分离的思考与实践 一》), 但同时也面临不少挑战。在淘宝复为什么我不会舍弃 Python 投奔 Go 语言
- Go语言中文网 - Golang中文社区
<meta name="author" content="polaris ">
为什么我不会舍弃 Python 投奔 Go 语言
· 392 次点击 ·
开始浏览 & &
本文的作者:Russ Cox
Russ Cox毕业于麻省理工和哈佛大学,曾在贝尔实验室参与过Plan 9 和 Unix操作系统的开发,最近在google,主要开发Go语言。
最近关于Go语言的话题很多,本月刚好是Go语言诞生3周年。这个语言在谷歌巨人的推动下最终很可能成为今后的主流语言。如果你想简单了解一下Go语言,这里有Go语言官方网站提供的一个很简单的中文版的“”,不妨一看。
下面是译文内容:
最近,由于一篇“(英文)”的博客,我收到了大量的邮件,这篇文章中,作者说Go语言除了“用返回值来处理异常错误”这点外,其它的都非常好。我想写出一点东西,解释一下Go语言为什么这样做,这会对大家都有用。
在Go语言中,规定的方式是,函数返回错误信息。这没什么。如果一个文件并不存在,op.Open函数会返回一个错误信息。这没什么。如果你向你一 个中断了的网络连接里写数据,net.Conn里的Write方法会返回一个错误。这没什么。这种状况在这种程序中是可以预料到的。这种操作就是容易失 败,你知道程序会如何运行,因为API的设计者通过内置了一种错误情况的结果而让这一切显得很清楚。
从另一方面讲,有些操作基本上不会出错,所处的环境根本不可能给你提示错误信息,不可能控制错误。这才是让人痛苦的地方。典型的例子;一个程序执行 x[j],j值超出数组边界,这才痛苦。像这样预料之外的麻烦在程序中是一个严重的bug,一般会弄死程序的运行。不幸的是,由于这种情况的存在,我们很 难写出健壮的,具有自我防御的服务器——例如,可以应付偶然出现的有bug的HTTP请求处理器时,不影响其他服务的启动和运行。为解决这个问题,我们引 入了恢复机制,它能让一个go例程从错误中恢复,服务余下设定的调用。然而,代价是,至少会丢失一个调用。这是特意而为之的。引用邮件中的原话:“这种设
计不同于常见的异常控制结构,这是一个认真思考后的决定。我们不希望像java语言里那样把错误和异常混为一谈。”
我刚开始提到的那篇文章里问“为什么数组越界造成的麻烦会比错误的网址或断掉的网络引出的问题要大?”答案是,我们没有一种内联并行的方法来报告在执行x[j]期间产生的错误,但我们有内联并行的方法报告由错误网址或网络问题造成的错误。
使用Go语言中的错误返回模式的规则很简单:如果你的函数在某种情况下很容易出错,那它就应该返回错误。当我调用其它的程序库时,如果它是这样写的,那我不必担心那些错误的产生,除非有真正异常的状况,我根本没有想到需要处理它们。
有一个你需要记在心里的事情是,Go语言是为大型软件设计的。我们都喜欢程序简洁清晰,但对于一个由很多程序员一起开发的大型软件,维护成本的增加 很难让程序简洁。异常捕捉模式的错误处理方式的一个很有吸引力的特点是,它非常适合小程序。但对于大型程序库,如果对于一些普通操作,你都需要考虑每行代 码是否会抛出异常、是否有必要捕捉处理,这对于开发效率和程序员的时间来说都是非常严重的拖累。我自己做开发大型Python软件时感受到了这个问题。 Go语言的返回错误方式,不可否认,对于调用者不是很方便,但这样做会让程序中可能会出错的地方显的很明显。对于小程序来说,你可能只想打印出错误,退出
程序。对于一些很精密的程序,根据异常的不同,来源的不同,程序会做出不同的反应,这很常见,这种情况中,try + catch的方式相对于错误返回模式显得冗长。当然,Python里的一个10行的代码放到Go语言里很可能会更冗长。毕竟,Go语言主要不是针对10行 规模的程序的。
Raymond Chen的文章是我读到过的最好的用来解释异常捕捉模式里问题的文章:
就是要说明这一点:Go语言程序员认为,把error作为一种内置的类型是非常重要的。
有时,你会发现,一种非本地的goto语句被当作错误恢复的方法,就像C语言里的longjmp 和 setjmp。这也不错,但最好只在内部用。如果调用者需要知道错误恢复的走向,那你的这种方式就不好了。
392 次点击 &
请尽量让自己的回复能够对别人有帮助
支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
支持 @ 本站用户;支持表情(输入 : 提示),见
图片支持拖拽、截图粘贴等方式上传
记住登录状态
本文的作者:Russ Cox
Russ Cox毕业于麻省理工和哈佛大学,曾在贝尔实验室参与过Plan 9 和 Unix操作系统的开发,最近在google,主要开发Go语言。
最近关于Go语言的话题很多,本月刚好是Go语言诞生3周年。这个语言在谷歌巨人的推动下最终很可能成为今后的主流语言。如果你想简单了解一下Go语言,这里有Go语言官方网站提供的一个很简单的中文版的“”,不妨一看。
下面是译文内容:
最近,由于一篇“(英文)”的博客,我收到了大量的邮件,这篇文章中,作者说Go语言除了“用返回值来处理异常错误”这点外,其它的都非常好。我想写出一点东西,解释一下Go语言为什么这样做,这会对大家都有用。
在Go语言中,规定的方式是,函数返回错误信息。这没什么。如果一个文件并不存在,op.Open函数会返回一个错误信息。这没什么。如果你向你一 个中断了的网络连接里写数据,net.Conn里的Write方法会返回一个错误。这没什么。这种状况在这种程序中是可以预料到的。这种操作就是容易失 败,你知道程序会如何运行,因为API的设计者通过内置了一种错误情况的结果而让这一切显得很清楚。
从另一方面讲,有些操作基本上不会出错,所处的环境根本不可能给你提示错误信息,不可能控制错误。这才是让人痛苦的地方。典型的例子;一个程序执行 x[j],j值超出数组边界,这才痛苦。像这样预料之外的麻烦在程序中是一个严重的bug,一般会弄死程序的运行。不幸的是,由于这种情况的存在,我们很 难写出健壮的,具有自我防御的服务器——例如,可以应付偶然出现的有bug的HTTP请求处理器时,不影响其他服务的启动和运行。为解决这个问题,我们引 入了恢复机制,它能让一个go例程从错误中恢复,服务余下设定的调用。然而,代价是,至少会丢失一个调用。这是特意而为之的。引用邮件中的原话:“这种设
计不同于常见的异常控制结构,这是一个认真思考后的决定。我们不希望像java语言里那样把错误和异常混为一谈。”
我刚开始提到的那篇文章里问“为什么数组越界造成的麻烦会比错误的网址或断掉的网络引出的问题要大?”答案是,我们没有一种内联并行的方法来报告在执行x[j]期间产生的错误,但我们有内联并行的方法报告由错误网址或网络问题造成的错误。
使用Go语言中的错误返回模式的规则很简单:如果你的函数在某种情况下很容易出错,那它就应该返回错误。当我调用其它的程序库时,如果它是这样写的,那我不必担心那些错误的产生,除非有真正异常的状况,我根本没有想到需要处理它们。
有一个你需要记在心里的事情是,Go语言是为大型软件设计的。我们都喜欢程序简洁清晰,但对于一个由很多程序员一起开发的大型软件,维护成本的增加 很难让程序简洁。异常捕捉模式的错误处理方式的一个很有吸引力的特点是,它非常适合小程序。但对于大型程序库,如果对于一些普通操作,你都需要考虑每行代 码是否会抛出异常、是否有必要捕捉处理,这对于开发效率和程序员的时间来说都是非常严重的拖累。我自己做开发大型Python软件时感受到了这个问题。 Go语言的返回错误方式,不可否认,对于调用者不是很方便,但这样做会让程序中可能会出错的地方显的很明显。对于小程序来说,你可能只想打印出错误,退出
程序。对于一些很精密的程序,根据异常的不同,来源的不同,程序会做出不同的反应,这很常见,这种情况中,try + catch的方式相对于错误返回模式显得冗长。当然,Python里的一个10行的代码放到Go语言里很可能会更冗长。毕竟,Go语言主要不是针对10行 规模的程序的。
Raymond Chen的文章是我读到过的最好的用来解释异常捕捉模式里问题的文章:
就是要说明这一点:Go语言程序员认为,把error作为一种内置的类型是非常重要的。
有时,你会发现,一种非本地的goto语句被当作错误恢复的方法,就像C语言里的longjmp 和 setjmp。这也不错,但最好只在内部用。如果调用者需要知道错误恢复的走向,那你的这种方式就不好了。
1065 人在线
&最高记录 2928
& studygolang.com Go语言中文网,中国 Golang 社区,致力于构建完善的 Golang 中文社区,Go语言爱好者的学习家园。
Powered by
&o&服务器由
赞助 &·&CDN 由
VERSION: V3.5.0&·&9.135248ms&·&为了更好的体验,本站推荐使用 Chrome 或 Firefox 浏览器
登录和大家一起探讨吧
记住登录状态
还不是会员

我要回帖

更多关于 舍弃我能舍弃的 的文章

 

随机推荐