因为架构师离开,新架构师使用python,所以团队转成使用python,我之前一直使用golang没有用python经验,很多地方感觉奇怪。于是想总结下这些共同和差异。

一、相同点

        1.程序的架构设计

        不管是golang还是python都在用来开发web应用时,程序架构设计上其实差别不大。都是基于MVC架构,来设计目录,model层,controller层,service层。具体到细节,比如分组路由,中间件,orm钩子函数,读取配置文件,获取数据库引擎。都是为了解决相同的问题,所以这些东西,我看着代码立马就明白思路,也能基本上手。

         2.程序环境

        在python中,一个项目一般有一个/venu目录叫“虚拟环境”,该项目所有依赖包都会在这里,避免了影响“主机”的Pyhon环境。同样的golang有go mod管理工具,用vendor目录来保存本程序所有依赖的包。

        3.唯一入口

        python一般有main.py文件作为程序的入口,golang也是main.go。我几乎遇到所有golang项目,第一眼看完目录结构,第二眼就找main.go了,然后go run main.go。都是唯一入口,对理解程序来说还是比较容易的。

        还有比如数据结构,列表,切片,map之类,所以我直接上手写python没多大问题。遇到最大的问题在不同点。从大得差异一点点说吧。

二、不同点

        1.WSGI

        Web Server Gateway Interface Web服务器网关接口,   发现这个概念之后,我一直有个疑问就是,为什么golang不需要这个协议?我写了两年golang web从没听说过哪个golang web框架还必须要支持另外一个协议。和网友讨论后才大致理解,关键在于golang标准库http包。大部分的golang web框架在解析http协议时都用的golang标准库http包,所以解析出的结果是一样的。而python web框架并没有使用python web服务器的标准库。

gin里面启动http服务器,使用的是golang标准库net/http

如何将python 嵌入到golang 中 python转golang容易么_开发语言

 beego同样

如何将python 嵌入到golang 中 python转golang容易么_python_02

python bottle中,可以指定web服务器

如何将python 嵌入到golang 中 python转golang容易么_python_03

如何将python 嵌入到golang 中 python转golang容易么_web框架_04

 这也能说明,为什么这几年golang web开发迅速成为了热门。开发人员根本不需要去理解什么复杂的概念,直接上手,很多web的东西golang标准库已经支持了,不需要第三方包,从开发效率来说,golang不弱。

        2.错误处理。

        python的错误处理,是使用try:except来包裹可能错误的代码,并当出现错误时处理。而golang是单独处理每一个出现错误的地方,包括每一个函数。我写golang时,已经习惯每一个函数都会返回一个错误结果,然后判断错误是否为空。所以当出现错误时,我立马就知道问题出在哪,而python我有时候还得查一会才能找到问题。比如,读写文件的错误,数据库的错误,具体函数的错误,想在except里处理其实代码量并不比golang少。最纠结的一点是,每个函数没有返回错误,我都感觉这个函数有问题,有很大的漏洞隐患,但是加上吧,我又给写成了golang代码。

        3.版本兼容性

        python2,python3在一些基本的方法上差异有时很突兀,比如字符串方法,map方法,列表在python2上有,python3又没有了。不过python3对基础数据结构提供的方法是真的好用!在golang里可能根本就没有这些方法。用的时候必须查文档。golang的兼容性基本没啥问题,毕竟说过会兼容以前版本不会很突然说这个方法1.11有1.15就没有了。也不会说1.15的程序不能跑在1.11。(但是golang我确实遇到过降级后,不能跑的问题。)

        4.异步

        这个我想好好说,可惜我没怎么用python的异步……只是真的用不习惯,可能golnag给我惯得,一个go就起了一个golang协程。

 

        5.面向对象

        python是面向对象的,golang并没有对象,但是可以说面向接口(interface)?写了几个月python,可以说一切都是对象,除了公共方法之类,其它都是类,然后实例化类。很好理解,其实学校里面学的就是面向对象,所以并没有什么难懂。而且在基础的“对象”使用上,golang和python其实没什么不同。

        6.入参

        python并不强制要求入参必须写明数据类型,所以很多时候根本看不懂代码,你看到一个参数传了进来,却不知道这个参数是什么类型。好几次我看着函数文档还是不知道入参的数据类型,这是真的让我抓狂。golang interface也有这个问题,但是毕竟很少直接传interface。

        最后我想说的是,尽管有规范,但是我感觉我写的python代码就是“shi”。特别是我要用python重构golang代码时,很多地方我不知道用python怎么写,重写完真的感觉漏洞百出,根本没有鲁棒性可言。