Skip to content
hanyong edited this page Jun 23, 2016 · 7 revisions

go 语言笔记

简单来看, go 语言想做一个 "更好的C" (类似 C++, D, Java, C# 等), 同时从 C, C++, Python, Java 等语言吸收了一堆乱七八糟的特性。 go 语法有一些简洁的进步, 也有许多恶心的退步。

天下语言出自 C, Java 在虚拟机层面做了变革, go 则在代码编译链接层面做了变革。 go 必须拿到所有源码, 消除了二进制三方库, 采用源码级依赖, 对代码语义、组织等进行整体分析和考虑, 从而可以引入和重新定义一些高级语义, 代码编写可以更贴近高层抽象而不是底层细节, 这也是一种抽象层面的虚拟机。 开发工具链对源码可以有更好的分析和整体把握。 与 Java 不同, go 代码最终还是被编译组织成本地二进制文件, 而不是中间字节码。 清楚底层细节对 go 依然很有用, 比如指针, 这又是与 C 一脉相承之处。

go 的优势:

  1. 数据表达能力。
[]int{ 1, 3, 5, }
map[string]int{ "a": 3, "b": 5, }
Point{ X: 3, Y: 5, }
  1. 自动类型推导。(高版本的 C++ 和 Java 也会支持)
  2. 多值返回和命名返回

go 的吐槽点:

  1. 依赖管理糟糕且不统一, IDE 支持比 java 差太多
  2. 3 方库和 3 方产品生态圈不成熟 (但 docker 圈使用很多)
  3. 异常支持差, 需要写很多无聊的错误检查代码, 即 if err != nil, 还好 go 的多值返回和命名返回减轻了一些工作量.
  4. 各种细节, 访问权限与命名强绑定, 糟糕的设计. 强类型枚举支持太差 (比 C++ 和 Java 都弱很多). 等等...
Clone this wiki locally