随着互联网的不断发展,越来越多的编程开发语言被程序员掌握,今天我们就一起来了解一下Python和Go语言编程之间都有哪些区别。

标准库:Go有一个相当不错的image标准库模块,以及命令行flag解析库。我不需要寻找任何外部依赖;diffimg-go实现没有依赖,而Python实现使用了相当重量级的三方模块(讽刺的是)Pillow。Go的标准库更有条理,而且经过深思熟虑,而Python的会逐步发展,它们是多年来由许多作者创建的,有许多不同的约定。Go标准库的一致性使开发者更易于预测任何给定的模块将如何发挥作用,而且源代码有非常好的文档记录。

使用标准image库的一个缺点是它不自动检测图像是否有一个alpha通道;所有图像类型的像素值都有四个通道(RGBA)。因此,diffimg-go实现要求用户指明是否要使用alpha通道。这个小小的不便不值得找三方库来修复。

c python 对比 速度 python对比go_c python 对比 速度

一个很大的好处是,标准库中有足够的内容,你不需要像Django这样的Web框架。用Go有可能在没有任何依赖关系的情况下建立一个真正可用的Web服务。Python号称“自带电池(batteries-included)”,但在我看来,Go做得更好。

静态类型系统:我过去使用静态类型语言,但我过去几年一直在使用Python编程。体验起初有点烦人,感觉它好像只是减慢了我的速度,它迫使我过度明确,即使我偶尔错了,Python也会让我做我想做的。有点像你给人发指令而对方总是打断你让你阐明你是什么意思,而有的人则总是点头,看上去已经理解你,但是你并不确定他们是否已经全部了解。它将大大减少与类型相关的Bug,但是我发现,我仍然需要花几乎相同的时间编写测试。

Go的一个常见缺点是它没有用户可实现的泛型类型。虽然这不是一个构建大型可扩展应用程序的必备特性,但它肯定会减缓开发速度。虽然已经有替代模式建议,但是它们中没有一个和真正的泛型类型一样有效。

静态类型系统的一个优点是,可以更简单快速地阅读不熟悉的代码库。用好类型可以带来许多动态类型系统中会丢失的额外信息。

接口和结构:Go使用接口和结构,而Python使用类。在我看来,这可能是有趣的区别,因为它迫使我区分定义行为的类型和保存信息的类型这两个概念。Python和其他传统的面向对象的语言都鼓励你将它们混在一起,但这两种范式各有利弊:

Go强烈建议组合而不是继承。虽然它通过嵌入继承,不用类,但其数据和方法不是那么容易传递。通常,我认为组合是更好的默认模式,但我不是一个绝对主义者,在某些情况下继承更合适,所以我不喜欢语言帮我作出这个决定。

接口实现的分离意味着,如果有许多类型彼此相似,你就需要多次编写类似的代码。由于缺少泛型类型,在Go中,有些情况下我无法重用代码,不过在Python中可以。

然而,由于Go是静态类型的,当你编写的代码会导致运行时错误时,编译器/源码分析器(linter)会告诉你。Python源码分析器也可以有一点这样的功能。但在Python中,当你试图访问一个可能不存在的方法或属性时,由于语言的动态性,Python源码分析器无法确切地知道什么方法/属性存在,直到运行时。静态定义的接口和结构是在编译时和开发过程中知道什么可用的方法,这使得编译时报错的Go比运行时报错的Python更可靠。

没有可选参数:Go只有可变函数,类似于Python的关键字参数,但不那么有用,因为参数需要是相同的类型。我发现关键字参数是我真正怀念的特性,这主要是你可以把任何类型的一个kwarg扔给任何需要它的函数,而无需重写它的每一个调用,这让重构简单了许多。我在工作中经常使用这个特性,它为我节省了很多时间。由于没有该特性,这使得我在处理是否应该基于命令行标志创建差异图像时显得有些笨拙。

冗长:Go有点冗长(尽管不是像Java那么冗长)。这部分是因为其类型系统没有泛型,但主要是因为语言本身很小,没有提供很多特性(你只有一种循环结构可以使用!)。我怀念Python的列表推导式(listcomprehensions)和其他函数式编程特性。如果你熟悉Python,你一两天就可以学完TourofGo,然后你就了解了整个语言。

错误处理:Python有异常,而Go在可能出错的地方通过从函数返回元组value,error来传播错误。Python允许你在调用栈中的任何位置捕获错误,而不需要你一次又一次地手动将错误传递回去。这又使得代码简洁,而不像Go那样被其臭名昭著的iferr!=nil模式搞得杂乱无章,不过你需要弄清楚函数及其内部的所有调用可能抛出的异常(使用exceptException:通常是一种糟糕的变通方案)。良好的文档注释和测试可以提供帮助,你在使用其中任何一种语言编程时都应该添加。Go的系统绝对更安全。如果你忽视了err值,你还是可以搬起石头砸自己的脚,但该系统使糟糕的主意变得更明显。