既然无需手动管理内存,像 J**a/Python/JS 那样不在语法层面上区分 primitive value 和 reference value 不是更简洁吗?为什么不支持指针运算,却还要有指针类型呢?
值类型可以是栈对象,比堆对象更高效。C# 的 gc 比 J**a 看上去牛逼的原因就是因为 C# 从诞生开始就支持值类型。虽然 J**a 的 GC 牛逼得多但也是逼出来的。所以保留值类型,可以让 go 程序有可能更高效。虽然 go 有指针逃逸分析,和自动优化堆对象,但是众所周知,go 的编译是出了名的快(简陋)所以有些 go 的缓存库标榜自己是 pointer-free 的(全都分配在 []value 上),因此性能比别人好。
我猜测 go 是想成为简单的 C(自动管理内存的 C), 所以保留了 C 中的一些概念. 但是 go 也有想 J**a 一样,默认传引用的类型, map, chan. 反而我觉得 J**a 这种 class 默认传引用 `还不好`,不够灵活.