Skip to content

简介

Go语言是Google开发的编程语言. Go是一门非常年轻的语言, 它的主要目标是兼具Python等动态语言的开发速度和C/C++等编译型语言的性能与安全性.

特点

性能强大

在Leetcode统一道题目的测试中:

  • Rust: ⌚ 0ms 📀 2.1MB
  • Go: ⌚ 0ms 📀 2.2MB
  • Java: ⌚ 0ms 📀 40.8MB
  • C: ⌚ 3ms 📀 9.6MB
  • C++: ⌚ 4ms 📀 10.4MB
  • Python: ⌚ 44ms 📀 16.4MB
  • Javascript: ⌚ 51ms 📀 49.2MB

可以看到同等运行时间下, Go的内存消耗明显小于Java.

在具体Web服务中的简单对比, 见这里.

Java会提前编译为字节码, 在JVM上运行. 当Java程序启动的时候, 即时编译器(JIT)被调用, 随时随地将其编译为本地代码来优化字节码, 以提高应用程序的性能. Go和Rust都是提前编译为本机代码, 并且在运行时不会发生进一步优化.

Java和Go都是垃圾收集语言, 有一个STW的副作用. 这意味着每当垃圾收集器运行的时候, 它将停止应用程序, 进行垃圾收集, 当完成后, 它将从它离开的地方恢复应用程序. 大多垃圾收集器需要STW, 但也有一些实现可以减少这种情况的发生.

Java在90年代创建的时候, 最大的卖点就是"一次编译, 到处运行". 在当时是很接地气的需求, 因为当时市场上没有很多的虚拟解决方案. 如今, 大多数CPU都支持虚拟化, 这使得Java语言开发的诱惑力消失了, Docker和其他解决方案提供了廉价的虚拟化, 它可以在任何地方运行.

在实际测试中, Java版本的应用会比Go或者Rust版本程序消耗了多个数量级的内存, 这意味着现实世界的应用程序, Java版本的运营成本更高. 在前两项测试中, Go应用程序的CPU比Java少约20%, 同时处理的请求多38%. Rust的CPU比Go少约57%, 请求多13%. 在第三项测试(CPU密集), Go和Rust的CPU使用率比Java高1%. Java能够比Go多提供约20%的请求, Rust比Java多提供约15%的请求.

出色的并发性

很多公司, 特别是中国公司, 即将或已经完成了使用Go语言改造旧系统的过程. 经过Go语言重构的系统能使用更少的硬件资源获得更高的并发和I/O吞吐表现. Go语言的并发是基于goroutine的, 它类似于线程, 但是并非线程, 可以将它理解为一种虚拟线程. Go语言运行的时候会调用它, 并将其合理的分配到每个CPU中, 最大限度地使用CPU性能.

学习曲线低

Go语言简单易学, 学习曲线平缓, 不需要像C++那样需要两到三年的学习期. Go的语言风格类似于C语言. 其语法在C语言的基础上进行了大幅的简化.

代码风格统一

Go语言提供了一套格式化工具 -- go fmt. 一些Go语言的开发环境或者编辑器在保存的时候, 都会使用格式化工具进行格式化, 保证了不同开发者提交的代码都是统一的格式.

编译速度快

Go的编译速度相比于其他语言Java/C/C++/Rust非常快.

开发效率高

Go语言实现了开发效率和执行效率的完美结合, 让你像写Python代码一样执行C代码.

基于 MIT 许可发布