Fork me on GitHub

Go语言开发-为什么是Go

为什么是Go

Go语言是于2007年作为google的一个内部项目启动的。其最初由是由Robert Griesemer、Unix 专家 Rob Pike 和Ken Thompson设计。在 2009 年 11 月 10 日, Go语言以一个自由的开源许可方式公开亮相。Go语言一直由包括其最初设计者加上Russ Cox, Andrew Gerrand, Ian Lance Taylor和许多其他开发者在内的Google团队开发。Go语言采取一种开放的开发模式,吸引了许多来自世界各地的开发者为其发展贡献力量,这些被信任被尊重的开发者获得了与Google员工一样的代码提交权限。另外,你还可以在Go Dashboard这个网站(godashboard.appspot.com/project)找到许多第三方的Go语言包。

Go语言是近15年来出现的最令人兴奋的新的主流语言,它是第一个直接面向21世纪计算机和开发者的语言。

Go语言被设计成拥有高效扩展特性以便其可被用来构建非常大的应用程序,并可在一台计算机上在几秒中内完成编译。闪电般的编译速度在一定程度上是因为该语言非常容易被解析,但更主要的是因为它的依赖关系管理。如果文件 app.go 依赖于文件 pkg1.go,而pkg1.go又依赖于 pkg2.go,在传统的编译型语言中,app.go 需要 pkg1.go 和 pkg2.go 的目标文件。但是在Go语言中, pkg2.go导出的所有内容都被缓存在 pkg1.go 的目标文件中,所以 pkg1.go 的目标文件足以单独建立app.go。对于只有三个源文件的程序来说,这看不出什么优劣,但是对于拥有大量依赖关系的大型应用程序来说,这样做可以获得巨大的编译速度提升。

由于Go语言构建速度如此之快,所以其也可被用于一些本可以使用脚本语言的场景中。此外,Go语言也可以用于构建基于Google App Engine的web 应用程序。

Go语言使用了非常干净且容易理解的语法,避免了像老的语言如C++(首次发布于 1983 年)或者Java(首次发布于 1995 年)中的复杂和冗长的缺点。Go语言是一种强静态类型的语言,这在有些程序员看来是编写大型程序的必要特性。然而由于Go语言简短的”声明并初始化”变量声明语法,程序员们并需要打太多字(在编译器可以推导出其类型的情况下,是不需要显示声明的),并且Go语言也支持强大且便捷的鸭子类型。

像C和C++这样的语言,当涉及内存管理时需要程序员做大量的工作,而这些工作本应有计算机本身完成,尤其是对于并发编程,要跟踪它们的内存分配是极其复杂和困难的。近年来,C++通过使用“智能”指针,因此在这方面有了很大的改善,但是在线程库方面还一直在追赶Java。Java通过使用垃圾收集器,减轻了程序员对于内存管理的负担。C语言只有一个第三方的线程库,即使C++现在已经有了一个标准的线程库。然而,使用 C,C++ 或 Java 编写并发程序时仍需要由程序员小心谨慎来确保能够在正确的时间锁定和解锁资源。

Go 编译器和运行时系统能够处理这些繁琐的跟踪问题。对于内存管理,Go语言拥有自己的垃圾回收器,所以没有必要使用智能指针或手动释放内存。Go语言的并发机制是基于计算机专家C. A. R. Hoare提出的CSP(Communicating Sequential Processes)思想来构建的,这意味着许多并发的Go语言程序不需要任何锁机制。此外,Go使用 goroutines ——一种非常轻量级的进程,可以被大量创建并可跨处理器和处理器核心自动进行负载平衡——以此来提供比老的基于线程并发的语言更细粒度的并发。事实上,Go语言的并发支持使用起来是如此简单和自然,当移植单线程程序到Go时,可以使并发的机会大增,从而可以提高运行时计算机资源的使用效率。

Go是一种务实的语言,对于语言的纯净度来说,其更在意语言的效率以及为程序员带来的便捷。例如,Go的内置类型和用户自定义的类型是不同的,因为前者在某些方面能够高度优化,而后者却不能。Go也提供两种基本的内置集合类型︰切片(可变长度数组)和映射(键-值字典或哈希表)。这些集合类型都是高效的,并能在大多数情况下满足需要。此外,Go语言支持指针(它是一个完全编译的语言——在性能上没有虚拟机挡路),这样就可以轻松地创建复杂的自定义类型,如平衡二叉树。

虽然 C 仅支持过程式编程,而Java则强制程序员使用面向对象的方式编程,但Go允许程序员使用最适合他们的编程范式编程。Go可以被用作纯粹的过程式编程语言,但依旧支持面向对象编程。我们将在本书中看到,虽然Go面向对象的方法从根本上不同C++、Java 或 Python——但是它更易于使用且在形式上更加灵活。

就像C语言一样,Go缺少泛型支持(C++中的模板);然而,事实上Go在相当多的情况下提供的一些特性消除了对泛型的依赖。Go不使用预处理器或包含文件(这也是它编译速度如此之快的另一个原因),这样就不需要像C和C++那样复制函数签名。因为没有预处理器,程序的语义就不能在程序员未干预的情况下被修改,但这种情况在C或C++中使用#defines时不小心就会发生。

可以说,C++,Objective-C和Java都曾经试图成为更好的Cs(后者间接的成为了更好的C++)。Go也可以被看做是更好的C,即使Go干净轻盈的语法容易让人联想到Python——因为Go的切片和映射都非常类似于 Python 的列表和 字典。然而,Go在语言精神上比任何其他语言都更接近于C,并可以被认为是试图消除C的缺陷,并保留C的所有精华,同时添加了许多强大且非常有用的独有的特性。

最初Go被构思为一个可以充分利用分布式系统以及多核联网计算机的用于开发大型项目的可以被快速编译的系统型编程语言。现在Go已经远远超出了原定的设想,它正被用作一种高效的通用编程语言,使用Go语言开发和维护系统都是一种享受。


目录


作者:Johnson
原创文章,版权所有,转载请保留原文链接。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注