golang 语言学习有感
但其实 golang 的精简恰到好处,当你用 golang 写了程序,过一段时间回头去修改的时候就会发现 golang 的伟大,它让一切都井井有条一目了然,并且非常容易重构和扩展。
但是后来发现,这其实是因为错误处理本身就是个麻烦事,try catch 那种方式企图掩盖错误处理的麻烦本质,但是并不完美,也有很多缺陷。
golang 那样设计是为了把这个麻烦本质暴露出来,如果根据 golang 的设计思想认真处理每一个 error,就会发现这对代码 debug 带来很大帮助。
加上最近 errors 库的小改进以及即将到来的一些改进,这个一直被很多人诟病的缺点也会得到很大改善。
简单说 GO 语言的优点有以下几点:
强制的代码风格(仁者见仁)
强大的标准库
对操作系统极少的依赖
优秀的性能
这些东西可能其他语言也都能满足,但是合到一起就会对上某些人的胃口,自然会赞不绝口。
Python:
自带电池 -> 强大的标准库
基于解释器的 -> 不依赖操作系统
优秀的性能 -> 要性能的就是 C 来写
JavaScript
npm -> 强大的标准库
我有 V8 -> 对操作系统极少的依赖
我有 V8 -> 优秀的性能
Java
我只管创建接口, 实现大厂来做 -> 强大的标准库
我有 JVM -> 对操作系统极少的依赖
我有 JVM -> 优秀的性能
以上所有:
强制的代码风格 -> editor config / ide 配置文件
强大的标准库?兄弟你再搞笑?
而 GO 语言在语言层面就实现了这些。我并没有说 go 语言在所有这些方面都做到最好了,但确实给开发者带来了不一样的体验。并且出现了不少杀手级项目,其他语言也能开发出这些项目,那为什么要用 GO 语言呢?
https://developer.aliyun.com/article/740696
习惯用 try catry 的, 回头好好读一下自己代码 写了多少 bug ( PS: 可能也不容易看出来)
1. 没有高性能好用的泛型,你说 interface{}?那个连 go 作者都受不了,因此导致没有抽象库可用如 reduce, map, flitter, any 等等函数;
2. 错误处理,就算是用`product type`,也没有设置好用的语法糖将 error 迭代下去,导致大量重复冗余的 if else
3. 自作主张的 golint, 你要是希望自己比较严谨,希望社区统一,就不要定死那么多可有可无的东西,大括号换行这些没所谓。cpu CPU Cpu 大小写没所谓,但,if else 我就喜欢用 else 显示标注,你连这要管我?? 我 export 函数就是不喜欢写注释你给我报错???还不能自定义??
4. 一开始没有想做好 包管理器 给开源社区的人用。。导致现在一大堆。。
想到再补充。。
重点当然不是格式化的问题
举一个另外的例子
sync.Map 上没有 length 或者 size 方法,获取元素的数量要用 sync.Map.Range 遍历
https://github.com/golang/go/issues/20680
这个链接有解释说为什么不加这个方法,a Len method would either be misleading or inefficient
类似这样的例子应该还有一些,所以有人觉得拿 Go 写的代码质量会更高,因为一些 misleading 或者 inefficient 的功能直接被删掉了
> Python:
> 优秀的性能 -> 要性能的就是 C 来写
几乎所有的语言都能调用 C 代码,照你这个说法,任何一个语言都有优秀的性能
> JavaScript
> npm -> 强大的标准库
npm 不是标准库,而且我几乎没见过有人给 JavaScript 的标准库说过好话
> Java
> 我有 JVM -> 优秀的性能
性能指的不单是执行时间,内存占用量也是性能的一部分,而 JVM 在这方面的性能很渣
即使单说执行时间,JVM 可能也只是在吞吐量上有优势
所以某种角度上来讲,“简”是 Go 的设计哲学之一。
以上个人感受,不同人可能会有不同的感受。
那是你可能不会,并不是很多人根本不知道。