为什么说2017年你必须要学习Go了

2017-01-14 03:55:23 来源:济宁新闻网

为什么要学习 Go  

go 是未来的服务端语言。??Tobias Ltke, Shopify 在过去的几年中,Golang 逐步流行起来。 还有什么能比一门新语言让码农们疯狂呢? 因此,我开始学习了一段时间 golang,在这里我将告诉你为什么你也应该学习这种新语言。 在本文里我不会告诉你怎么写 hello world。 我要分析计算机硬件软件的当前阶段,以解释为什么我们需要像 Go 这样的新语言?

硬件限制  

摩尔定律正在失效第一个具有 3.0GHz 时钟速度的 pentium 4 处理器是由英特尔于 2004 年推出的。 而今天,我的 Mackbook pro 2016 的 CpU 时钟速度为 2.9GHz。 可以看到在过去的十年中,CpU 处理能力没有太大的进步。 您可以在下面的图表中看到这一点。

  从上面的图表可以看出,单线程的性能和处理器的频率在过去的十年内保持平稳。如果你认为添加更多的晶体管是解决方案,那么你错了。这是因为在较小的尺度上一些量子性质开始出现(如隧道,因为它实际上用掉更多的更多的晶体管(为什么?)并且添加晶体管的性价比在下降。 所以制造商开始向处理器添加越来越多的核心。现在我们有四核和八核 CpU 可用。 同时我们还引入了超线程。还向处理器添加更多缓存以提高性能。 但上述解决方案也有其局限性。我们不能向处理器添加更多的缓存以提高性能,因为缓存具有物理限制:缓存越大,缓存越慢。向处理器添加更多核心也具有成本。此外,这都不能无限扩展。这些多核处理器可以同时运行多个线程,并在纸面上带来并发性。我们稍后将讨论这一问题。 所以,如果我们不能完全依靠硬件的改进来提升性能,更高效的软件也是我们需要考虑的手段。但遗憾的是,现代编程语言并不高效。

Go has goroutines!!  

如上所述,硬件制造商正在向处理器添加越来越多的核心以提高性能。使用这些处理器的所有数据中心,在未来几年内核数量将会大大增加。更重要的是,今天的应用程序使用多个微服务来维护数据库连接,消息队列和缓存。因此,我们开发的软件和编程语言应该轻松支持并发性,并且它们应该随着核心数量的增加而轻松扩展。 但是,大多数现代编程语言(如 Java,python 等)发明于 90 年代的单线程环境。当然这并不意味着他们不支持多线程(译者的话 python 确实不支持多线程)。大多数编程语言支持多线程。真正的问题来自并发执行和线程锁,竞争条件和死锁。这些东西使得在这些语言上创建多线程应用程序很困难。 例如,在 Java 中创建新线程会消耗大约 1MB 的内存堆大小。最终如果你创建了数千个线程,这将对堆内存造成巨大的压力,并将由于内存不足而被操作系统杀死。此外,如果你想在两个或多个线程之间进行通信,也比较困难。 另一方面,Go 在 2009 年发布时,多核处理器已经流行起来。这就是为什么 GoLang 以并发为第一要务。 Go 使用 goroutines 而不是线程。新建 goroutine 只使用近 2KB 的内存,你可以创建数百万 goroutine。

  当然还有其他的好处:

具有可增长的分段堆。这意味着他们只在需要时才使用更多的内存。Goroutines 的启动时间比线程快。Goroutines 带有内置的原语,以便在它们之间(channel)安全地通信。Goroutines 允许您避免在共享数据结构时使用互斥锁。此外,goroutines 和 OS 线程不是1:1 映射。 单个 goroutine 可以在多个线程上运行。 Goroutine 被复用到少量的 OS 线程中。

  以上几点,使 Go 非常强大,可以在处理并发(如 Java,C和C++)的同时保持代码的优雅(像 Earlang)。

Go 直接运行在硬件上  

  使用C,C ++ 的一个最大的好处是它们的性能比其他现代高级语言(如 Java / python)更强。 因为 C / C ++ 是编译执行而不是解释执行的。 当您使用 Java 或其他基于 JVM 的语言构建应用程序时,它将代码编译为字节码,在执行时,JVM 解释字节码并将其转换为处理器可以理解的二进制代码。

而C,C中释放和分配内存太过痛苦。 即使大多数编程语言可以使用垃圾收集器或引用计数算法处理对象分配和删除。 Go 同时拥有上面提到的好处。 Go 是像C/C++这样的低级语言并且是编译型语言。 这意味着它的性能几乎更接近低级语言。 并且 Go 还使用垃圾回收来分配和释放内存。 所以不需要 malloc 和 free!!!

Go 代码容易维护  

  Go 有着非常整洁和干净的语法。Go 的设计者在创建语言时考虑到了这一点。 由于 google 有非常大的代码库,成千上万的开发人员正在使用同一个代码库,代码应该易于其他开发人员理解。这将使代码易于维护和修改。 Go 故意去掉了很多现代 OOp 语言具有的功能。

没有类。 Go 只有结构体而不是类。

不支持继承。 这将使代码容易修改。 在其他语言(如 Java / python)中,如果 ABC 类继承了类 XYZ,并且在类 XYZ 中进行了一些更改,那么这可能会在继承 XYZ 的其他类中产生一些副作用。 通过删除继承,Go 使得很容易理解代码(因为没有超类)。没有构造函数。无注解(annotation)。没有泛型(generics)。

没有异常。

以上的差异使 Go 与其他语言非常不同。 当然你可能不喜欢上面的一些点。 但是,在没有上述功能的情况下你需要做的仅仅是多写2-3 行代码。 然而这样会使你的代码更加简洁易懂。

  上图显示 Go 几乎与C/C++一样高效,同时保持代码语法简单,如同 Ruby,python。 这是一个对人类和机器来说双赢的局面! 与其他新语言(像 Swift)不同,Go 的语法非常稳定。 自从 2012 年首次公开发布 1.0 版以来,它保持不变。这使得它向下兼容。

Go 的背后是 Google  

虽然这不是直接的技术优势。 但 Go 是由 Google 设计和支持的。 Google 拥有世界上最大的云基础架构之一,并且可以大规模扩展。Go 是由 Google 设计的,以解决他们需要的可扩展性性问题。这些也是你在创建自己的服务时将面临的问题。Go 也被一些大公司使用,如 Adobe,BBC,IBM,英特尔等等。

结论  

即使 Go 和其他面向对象的语言非常不同,但它同时为您提供高性能(如C/C++),超级好用的并发处理(如 Java)和简洁的代码(如 python/perl)。如果你没有任何计划学习 Go,我还是会说软件开发人员需要写出超高效的代码。开发人员需要了解硬件并相应地优化程序。优化软件以运行在更便宜和更慢的硬件(如 IOT 设备)以提升最终用户体验。

济宁IT新闻