March 27, 2017
Go 语言初印象
前言
最近决定开始学习 go 语言,有以下原因:
- 对 go 语言慕名已久,关注过各个论坛或是博客上关于 go 的正面和负面的评价。
- 最近 go, rust, swift 等编译语言比较流行,go 相对简单
- 工作实践中对 python, cojure 等动态类型语言又爱又恨
- 需要有一个系统级别的语言,来降低 c 开发的难度
- 学习语言并学习其解决问题之道有助于扩展思路
- 有趣
教程
入门教材我选择了这么几本:
- learning-go
- How to write Go Code
- A Tour of Go
- (进行中)The Go Programming Laugnage ( Alan A.A. Donovan, Brian W. Kernighan )
感受
与 python 的比较
- go 的语法要求比较严格,作为保护无可厚非,但不习惯
- 标准库不如 python 丰富,竟然没有官方的 set
- 在工作环境(不能上网)中,go get 比较麻烦,虽然 pip 可能也不简单
- 缺少通用函数支持,甚至没有通用的 max 函数
- 缺少 python 的 list comprehension
- 缺少 python 的 yield 和迭代器生成语法
- 使用第三方包时,版本管理比较简陋
- 文件操作、字符串操作不方便
- 没有异常机制,导致代码中大量的返回 error 检查
- 缺少完整的元编程,不能重载操作符
- 基本类型和自定义类型区别比较明显,比如在 dict 中不能以自定义类型作主键
与 c 的比较
- 没有像 c 一样的指针操作
- 不用手动内存管理,比 c 愉快得多
- 不用作原型声明
- 自带工具集简化了开发环境,vim 加插件暂时足够开发之用
- 可以多返回值
- 多了 dict 内置类型
- 手册比 c manual 优秀
- 代码和 c 的风格接近
问题
- array 与 slices 的区别,特别是字面量表示
- go 是按值来传递参数的,那么在何种情况下需要使用指针来避免拷贝性能损失
- 如何高效使用 goroutine 来编写并发程序
- cgo 使用的细节
- interface 与泛型
总结
- 期望 go 完全替代 python 不现实,go 有自己的编程风格和范式
- 有些先入为主的思路,让我们对 go 的一些设计有疑虑
- 现在的一些问题可能是因为对 go 理解不够
- 还需要继续深入学习,从优秀代码吸收经验