大概在15年就接触过golang了,不过那时候只是大概看了下并没有实际用上,那时候的golang还不是很完善,国内拉取过项目的依赖包特别慢,有些因为某种原因根本无法拉取下来。
18年的时候再度拿起go,但还是没能用在项目中,直到22年,才开始在项目中用上go。说实话go做业务开发并不顺手,但这是相对于动态编程语言来说的,相比于PHP的开发效率,go显然慢了一大截。很可惜PHP在某些业务场景下没能够很好的支持,比如对消息队列RocketMQ的支持,即使支持了,也是基于HTTP协议的实现,效率大打折扣。对Kafka的支持也是非常的基础,用PHP跑Kafka常驻进程还经常有错误莫名其妙的错误。PHP生态里一个可靠的消息队列系统都很难找到,很多公司还在用N多年不维护的Resque。另外一个也是性能问题。目前生产上的业务越来越复杂,一个流程下来,感觉PHP跑起来有点吃力,php-fpm的方式下并发性能比较差。
为什么不用swoole或者hyperf呢?实际项目中也在用。不过我个人非常不喜欢swoole和hyperf的生态分裂。hyperf就是完全抄袭SpringBoot的产物,启动项目各种扫描,创建各种BeanDefinition对象。swoole和Hyperf社区的人也挺会催牛逼的,实际测试Hyperf性能没有那么高,看看网上开源的benchmark就知道了。而且Hyperf不仅抄袭SpringBoot,还把很多第三方开源的PHP库修复为Hyperf自己生态的库,比如Laravel的DB库,Kafka库,Jwt库等等。。。Swoole也只不过是在模仿go的协程协程而已。还自己搞了个swoole-cli。swoole作者公开反对Fiber,也是为了自己swoole的商业利益罢了。swoole和hyperf的生态很小,但我个人觉得这个生态的毒害性很大。与PHP的初衷背道而行。
其实Web开发领域,Java是最佳选择,生态好,轮子多,在SpringBoot框架里大家写出来的代码都差不多。但我个人觉得Java编程非常的啰嗦。SpringBoot的那一套约定编程也不习惯。Java做Web开啊除了啰嗦没其他毛病。
go有一些优点,也有他自身的缺点。很多人都说go上手极快,其实go上手不快,实际拿go做Web项目就知道对go的理解程度还是挺高的,并非1,2周就能够上手,即使上手了,写出来的也是垃圾代码,不好维护。go有很多语言特性是他的优点,比如go里的组合优于继承,go的隐性实现接口也就是Duck Type,还有原生支持协程。用go写出稳定的高并发的程序不是一件容易的事情。另外go的标准库非常的丰富,比如字符串和[]byte的操作库,encoding/json库,还有 net/http 库都是可以直接用的。还有go的time库。github上还有像tunny这类协程库也是非常的好用。还有bigcache提供了基于内存高性能缓存,其实现原理不复杂。go的web框架我认为比较好的有gin和fiber。fiber主打高性能。gin也不错,而且非常轻量级,一个框架也就几千行代码。你去看看Spring代码,能把你吓死。搜索github的go开源库你会发现,go的类库普遍都是小巧精悍,设计的很简洁。
go也有一些缺点。比如if err != ni 在编写代码时需要不断的出现,代码一眼看过去都是错误处理。还有泛型,目前支持的不是非常完善。但对于业务开发来说其实影响不大。泛型主要还是写库的时候用的多。没了泛型,那就用interface{}来实现。
go原本设计是来替换C++的,但目前看来是不可能了。go的GC优化的不是很完善,但未来肯定会越来越好。带GC的打不过静态的C++这是很正常的,用go做基础服务明显优于C++,比如K8s,Docker,Caddy。但设计超高性能方面,还得是C/C++。可能以后Rust可以替代C++。我个人非常反感C++的复杂性。C这么多年作为Linux内核的唯一指定语言,不让C++掺一脚不是没有原因的,C++确实太难用。