为什么我不会舍弃Python投奔Go语言

最近,由于一篇“为什么我不会舍弃Python投奔Go语言(英文)”的博客,我收到了大量的邮件,这篇文章中,作者说Go语言除了“用返回值来处理异常错误”这点外,其它的都非常好。我想写出一点东西,解释一下Go语言为什么这样做,这会对大家都有用。



本文作者:Russ Cox

在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行规模的程序的。

就是要说明这一点:Go语言程序员认为,把error作为一种内置的类型是非常重要的。

附言

有时,你会发现,一种非本地的goto语句被当作错误恢复的方法,就像C语言里的longjmp 和 setjmp。这也不错,但最好只在内部用。如果调用者需要知道错误恢复的走向,那你的这种方式就不好了。

时间: 2024-08-11 10:35:43

为什么我不会舍弃Python投奔Go语言的相关文章

为什么我不会舍弃 Python 投奔 Go 语言

本文的作者:Russ Cox Russ Cox毕业于麻省理工和哈佛大学,曾在贝尔实验室参与过Plan 9 和 Unix操作系统的开发,最近在google,主要开发Go语言. 最近关于Go语言的话题很多,本月刚好是Go语言诞生3周年.这个语言在谷歌巨人的推动下最终很可能成为今后的主流语言.如果你想简单了解一下Go语言,这里有Go语言官方网站提供的一个很简单的中文版的"Go语言半小时速成教程",不妨一看. 下面是译文内容: 最近,由于一篇"为什么我不会舍弃Python投奔Go语言

机器学习算法基础(Python和R语言实现)

简介 谷歌的无人驾驶汽车已经受到了世人很大的关注,但公司的未来却是在机器学习领域,因为这项技术将使电脑更智能,更人性化.--埃里克·施密特(谷歌主席) 我们可能正经历着人类最明确定义的阶段,这个阶段计算机计算从大型主机,到个人电脑,到云计算.但这些并不是根本原因,而是接下来几年中将会发生的. 这个时期使那些像我一样的人们兴奋的是工具和技术的开放,这得以于计算机领域的蓬勃发展.今天,作为一名数据科学家,我能以很低的成本搭建一个拥有复杂算法的数据处理系统.但是达到这样的结果,我也经历了在黑夜中艰苦的

Python VS R语言?数据分析与挖掘该选哪一个?

什么是R语言? R语言,一种自由软件编程语言与操作环境,主要用于统计分析.绘图.数据挖掘.R本来是由来自新西兰奥克兰大学的罗斯·伊哈卡和罗伯特·杰特曼开发(也因此称为R),现在由"R开发核心团队"负责开发.R基于S语言的一个GNU计划项目,所以也可以当作S语言的一种实现,通常用S语言编写的代码都可以不作修改的在R环境下运行.R的语法是来自Scheme. R的源代码可自由下载使用,亦有已编译的可执行文件版本可以下载,可在多种平台下运行,包括UNIX(也包括FreeBSD和Linux).W

《Python核心编程(第二版)》——1.7 比较Python(Python与其他语言的比较)

1.7 比较Python(Python与其他语言的比较) Python已经和很多语言比较过了.一个原因就是Python提供了很多其他语言拥有的特性,另外一个原因就是Python本身也是由诸多其他语言发展而来的,包括ABC.Modula-3.C.C++.Algol-68.SmallTalk.Unix shell和其他的脚本语言,等等.Python就是"浓缩的精华":Van Rossum研究过很多语言,从中吸收了许多觉得不错的特性,并将它们溶于一炉. 然而,往往因为Python是一门解释型

Python赶超R语言,成为数据科学、机器学习平台中最热门的语言?

近日,kdnuggets做了一个关于数据科学.机器学习语言使用情况的问卷调查,他们分析了954个回答,得出结论--Python已经打败R语言,成为分析.数据科学和机器学习平台中使用频率最高的语言.有关此次问卷更具体的情况如何?笔者将kdnuggets上发表的总结文编译整理如下: 之前我们在kdnuggets上做了这样一个问卷调查,2016.2017两年,在分析.数据科学和机器学习的工作中,你用R语言,还是Python,或两者都用,或选择其他的语言? 通过分析954个回答,我们得出了这样的结论:虽

Python和GO语言实现的消息摘要算法示例_python

常用的消息摘要算法有MD5和SHA,这些算法在python和go的库中都有,需要时候调用下就OK了,这里总结下python和go的实现. 一.python消息摘要示例 代码如下: 复制代码 代码如下: #! /usr/bin/python '''       File      : testHash.py       Author    : Mike       E-Mail    : Mike_Zhang@live.com ''' import hashlib src = raw_input(

python和C语言分别实现快速排序

python 部分: 代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->from random import Random def quick_sort(arr): if len(arr) > 1: qsort(arr,0,len(arr)-1) def qsort(arr,start,end): base = arr[start] pl =

《Python自然语言处理》——第1章 语言处理与Python 1.1 语言计算:文本和词汇

第1章 语言处理与Python 我们能够很容易地得到数百万数量级的文本.假设我们会写一些简单的程序,那可以用它来做些什么?本章将解决以下几个问题. (1)通过将技术性较简单的程序与大规模文本结合起来,我们能实现什么? (2)如何自动地提取出关键字和词组,用来总结文本的风格和内容? (3)Python编程语言为上述工作提供了哪些工具和技术? (4)自然语言处理中有哪些有趣的挑战呢? 本章分为风格完全不同的两部分.在1.1节,我们将进行一些与语言相关的编程练习而不去解释它们是如何实现的.在1.2节,

深入浅析 C++ 调用 Python 模块_C 语言

一般开发过游戏的都知道Lua和C++可以很好的结合在一起,取长补短,把Lua脚本当成类似动态链接库来使用,很好的利用了脚本开发的灵活性.而作为一门流行的通用型脚本语言Python,也是可以做到的.在一个C++应用程序中,我们可以用一组插件来实现一些具有统一接口的功能,一般插件都是使用动态链接库实现,如果插件的变化比较频繁,我们可以使用Python来代替动态链接库形式的插件(堪称文本形式的动态链接库),这样可以方便地根据需求的变化改写脚本代码,而不是必须重新编译链接二进制的动态链接库.灵活性大大的