March 27, 2017

Go 语言初印象

前言

最近决定开始学习 go 语言,有以下原因:

  • 对 go 语言慕名已久,关注过各个论坛或是博客上关于 go 的正面和负面的评价。
  • 最近 go, rust, swift 等编译语言比较流行,go 相对简单
  • 工作实践中对 python, cojure 等动态类型语言又爱又恨
  • 需要有一个系统级别的语言,来降低 c 开发的难度
  • 学习语言并学习其解决问题之道有助于扩展思路
  • 有趣

教程

入门教材我选择了这么几本:

  1. learning-go
  2. How to write Go Code
  3. A Tour of Go
  4. (进行中)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 理解不够
  • 还需要继续深入学习,从优秀代码吸收经验