InfoQ■Python 切换到 Go的9 个理由,从


InfoQ■Python 切换到 Go的9 个理由,从
文章图片
作者丨ShivMcIntyre
译者丨刘雅梦
策划丨Tina
切换到一种新的编程语言通常是一件大事 , 特别是当团队成员对原始语言有丰富经验时 。 今年年初 , Stream将其主要编程语言从Python切换到了Go 。 本文将会解释他们决定从Python切换到Go的一些原因 。
使用Go的理由
理由1:性能
InfoQ■Python 切换到 Go的9 个理由,从
文章图片
Go非常快 。 它的性能接近Java或C 。 Go的速度比Python快30倍 。
理由2:语言本身的性能很重要
对于许多应用程序而言 , 编程语言只是应用程序和数据库之间的粘合剂 。 语言本身的性能通常并不重要 。
Stream是一家API提供商 , 它为500家公司和超过2亿的最终用户提供了反馈基础设施 。 多年来 , 我们一直在优化Cassandra、PostgreSQL、Redis等软件的性能 , 但是现在我们已经达到了我们所使用编程语言的极限 。
Python是一门伟大的语言 , 但是对于序列化/反序列化、排序和聚合等示例 , 它的性能非常差 。 我们经常会遇到性能问题 , Cassandra花费1ms的时间来检索数据 , 而Python将其转换成对象则需要10ms的时间 。
理由3:开发人员的效率 , 而无需太多创新
请看下“如何开始学习Go”教程中的如下Go代码片段 。
typeopenWeatherMapstruct{}func(wopenWeatherMap)temperature(citystring)(float64,error){resp,err:=http.Get("http://api.openweathermap.org/data/2.5/weather?APPID=YOUR_API_KEY&q="+city)iferr!=nil{return0,err}deferresp.Body.Close()vardstruct{Mainstruct{Kelvinfloat64`json:"temp"`}`json:"main"`}iferr:=json.NewDecoder(resp.Body).Decode(&d);err!=nil{return0,err}log.Printf("openWeatherMap:%s:%.2f",city,d.Main.Kelvin)returnd.Main.Kelvin,nil}
如果你刚开始学习Go , 阅读这段代码不会有太多惊喜 。 它演示了赋值、数据结构、指针、格式化和内置的HTTP库 。
从我首次接触编程开始 , 我总是喜欢使用Python的高级特性 。 Python使我们能从正在编写的代码中获得很好的想法 。 例如 , 我们可以:
初始化代码时 , 使用元类(MetaClasses)自己注册类
切换“True”和“False”
将一个函数添加到内置函数列表中
通过魔术方法(MagicMethod)重载运算符
这些特性非常有趣 , 但是 , 大多数程序员都认为这会增加阅读他人代码的难度 。
Go会迫使我们使用最基本的东西 , 这使得阅读他人代码变得更容易 。
注:当然 , “容易”取决于具体的项目 。 如果只是创建一个基本的CRUDAPI , 我仍然建议使用Django&DRF或Rails 。
理由4:并发和通道
作为一门编程语言 , Go总是尽可能地保持简单 。 它没有引入太多的新概念 , 因为它的目标是创建一门易于使用的编程语言 。 它唯一具有创新性的地方是Goroutines(go协程)和Channels(通道) 。 Goroutines是Go的轻量级线程解决方案 , 而Channels是与Goss交互的首选方式 。
Goroutines非常轻量 , 仅需要几千字节的额外内存 。 而且由于Goroutine如此轻量 , 因此可以同时运行数百甚至数千个Goroutine 。
我们可以使用Channels在Goroutines之间进行通信 。 Go运行时处理所有的内部复杂性 。 基于Goroutines和Channels的并发方案使应用程序能够轻松使用所有可用的CPU内核并处理并发IoO , 而无需进行复杂的开发 。 与Python/Java相比 , 在Goroutines上运行函数只需要很少的固定代码 。 我们只需要使用关键字“go”调用函数即可:
packagemainimport("fmt""time")funcsay(sstring){fori:=0;i


推荐阅读