入手golang,对比python聊聊想法
- 背景
- 学习
- 感悟
背景
入职几个月以来,花了一点时间入门go ,平时上下班路上读读<Go语言编程>或者<Go语言实践>,写了大量的书本代码,然后上手写了两个项目:一个后端高IO的api,另外一个是 web 调度系统,等到第一个系统写完并上线后,完成了各种监控(prometheus),错误发现(sentry),以及日志系统(elk),对golang的工程化有了一次比较好的认识,第二个系统(小工具)的研发进度就推的非常快,从0开始认识golang,到现在研发系统的落地,前后也就差不多3个月左右的时间。
学习
golang是一门非常好的语言,在入手之前,我有C#及python经验,由于一直写python,在刚入门go的时候都带着非常不适应感,静态语言有他特定的写法,特别是golang还有他非常强的洁癖(?):
- 没有使用的变量编译会报错
- 没有使用的包编译会报错(可以使用别名_绕过)
- 统一的代码风格,是的,统一而且唯一
- 没有所谓的面向对象的特性: 多态和继承
- 处理字符串会让你很”痛苦”
- 恶心的包管理(go1.12以后有了go mod)
…
在学习一门”语言”的时候,我不可避免的真的带上了锚定效应: 它为什么不是这样的,为什么要是这样的?!心生抵触,然后写了很多,最后接受下来,那是真香。特别是golang,带给我的是一种非常爽的体验,举个例子,在以前写高IO操作的时候,没办法只能使用类似的,gevent, twisted,或者其它的第三方库 来实现高并发与高IO,python内置的threadpool,multiprocess 或者 thread 用起来也是有点不那么得心应手,有同学还会补一刀说,cython还有GIL呢,你多线程也是伪多线程,等到了python3以后,官方终于有稳定的asyncio了,但是集成http api 的时候,还是会有一点”产能”不足,这个还真不是笔者的个人感受,请看里面的评测图
来源 https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=db
放眼望去,一个能打的都没有,有同学要说django,flask,sanic呢?你怎么做叛徒了,之前不是说python下还有好多高性能框架呢?
python下的web api 框架,也只是在python的生态体系之下,等到了见了更多的框架,更多语言之后,才慢慢了解自己的认知有多固化
对于我来说,想学golang那是非常久的事了,先不说golang的goroutine有多香,且说go的静态语言属性,已经能帮我省了不少事情了,而且在工程化这个角度,golang的框架真的不要太多了,不论 http api 还是rpc ,又或者更底层的TCP/IP层的轮子(各种proxy有没有),那是多到不要不要的,想到了那句老话:小孩子才做选择,我,全都要!
感悟
不要被语言限制思维,也不要给自己的思维上锁,多看看其它的语言,多了解其它的东西,不论是数学,底层的tcp/ip 协议,编译原理等,如果你愿意花时间 ,学到的东西比其它人多,希望各位读者朋友也能有所收获,文中提到的go版本的简单调度器也会考虑开源一个小版本出来