Golang在设计的时候保留了指针,而不是像java和python一样,将指针透明化是因为结构体可以直接用来比较相等,而非比较指针,Java 里面的 == 操作符除了基本类型有用,其他类型几乎没用。与 C 语言更好地交互。
一、Golang在设计的时候保留了指针的原因
Golang在设计的时候保留了指针,而不是像java和python一样,将指针透明化是因为结构体可以直接用来比较相等,而非比较指针,Java 里面的 == 操作符除了基本类型有用,其他类型几乎没用。
与C语言更好地交互。Go可以通过cgo与C语言无缝交互。Go里面的结构体基本上不用特殊处理就能传递给C的函数使用。主要得益于Go的结构体和的一样都是值类型。
开发者能更好的掌控内存布局。一个结构体数组就是一段连续内存,而不是一个指针数组。
减轻GC压力。紧凑的内存布局减少了GC对象的个数,比如一个100w 长度的结构体数组就是一个 GC 对象,而不是100w 个。
减轻堆内存的分配压力。函数通过传值的方式传递参数后,原变量不会发生逃逸,可以被分配在栈上
Go 为了内存安全,虽然有指针,但不支持指针算数,但结合 unSAFe.Pointer 也可以完成一些非常规情景下的精细内存操作。比如结合 mmap 实现堆外内存管理,runtime 里面的内存管理就是这么来的,完全不用另外用C语言来实现。 这也是可以使用 Go 语言来写操作系统(eggos)的原因。
延伸阅读:
二、Go 性能
Go 编译为本地可执行文件。许多 Go 的用户来自 Python、Ruby 或 Node.js。对他们来说,这是一种令人兴奋的体验,因为他们看到服务器可以处理的并发请求数量大幅增加。当您使用非并发(Node.js)或全局解释器锁定的解释型语言时,这实际上是相当正常的。结合语言的简易性,这解释了 Go 令人兴奋的原因。
然而与 Java 相比,在 原始性能基准测试 中,情况并不是那么清晰。Go 打败 Java 地方是内存使用和垃圾回收。
Go 的垃圾回收器的设计目的是 优先考虑延迟,并避免停机,这在服务器中尤其重要。这可能会带来更高的 CPU 成本,但是在水平可伸缩的体系结构中,这很容易通过添加更多的机器来解决。请记住,Go 是由谷歌设计的,他们从不会在资源上面短缺。
与 Java 相比,Go 的垃圾回收器(GC)需要做的更少:切片是一个连续的数组结构,而不是像 Java 那样的指针数组。类似地,Go maps 也使用小数组作为 buckets,以实现相同的目的。这意味着垃圾回收器的工作量减少,并且 CPU 缓存本地化也更好。
Go 同样在命令行实用程序中优于 Java :作为本地可执行文件,Go 程序没有启动消耗,反之 Java 首先需要加载和编译的字节码。