简史
1、诞生
2007年,谷歌三位工程师:罗布•派克(Rob Pike), 肯•汤普逊(Ken Thompson)和罗伯特•格里泽默(Robert Griesemer)开始设计一门全新的语言,这是 Go 语言的最初原型
谷歌把Go作为一个20%项目开始研发,即让员工抽出本职工作之外时间的20%, 投入在该项目上。
Go 项目团队将 2009 年 11 月 10 日,即该语言正式对外开源的日字作为其官方生日。源代码最初托管在 code.google.com 上,之后几年才逐步的迁移到 GitHub 上。
它是基于编译、垃圾收集和并发的编程语言。 Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美 C / C++代码的速度,而且更加安全、支持并行进程。作为出现在21世纪的语言,其近C的执行性能和近解析型语言的开发效率,以及近乎于完美的编译速度,已经风靡全球
2、吉祥物
Go语言的吉祥物如下,像鼹鼠:
其实是一种英文名为gopher的小动物,中文叫囊地鼠:
3、特性
总而言之:简洁 快速 安全 并行 开源
具体而言:
-
保留但大幅度简化指针:
Golang 保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在 Golang 中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。
2.多参数返回:
还记得在C里面为了回馈多个参数,不得不开辟几段指针传到目标函数中让其操作么?在 Go 里面这是完全不必要的。而且多参数的支持让 Go 无需使用繁琐的 exceptions 体系,一个函数可以返回期待的返回值加上 error,调用函数后立刻处理错误信息,清晰明了。
3.Array, slice, map 等内置基本数据结构
Golang 最让人赞叹不易的特性,就是 [interface 的设计]。任何数据结构,只要实现了 interface 所定义的函数,自动就 implement 了这个 interface,没有像 Java 那样冗长的 class申明,提供了[灵活太多的设计度和 OO (面向对象)抽象度],让你的代码也非常干净。
4.OO 面向对象: Golang 本质上不是面向对象语言,它还是过程化的。但是,在 Golang 中, 你可以很轻易的做大部分你在别的 OO 语言中能做的事,用更简单清晰的逻辑。是的,在这里,不需要 class,仍然可以继承,仍然可以多态,但是速度却快得多。因为本质上,OO 在 Golang 中,就是 普通的 struct 操作 。
5.Goroutine : 如果你完全不了解 Goroutine,那么你只需要知道,这玩意是超级轻量级的类似线程的东西,但通过它,你不需要复杂的线程操作锁操作,不需要 care 调度,就能玩转基本的并行程序。在 Golang 里,触发一个 routine 和 erlang spawn 一样简单。基本上要掌握 Golang,以 Goroutine 和 channel 为核心的 内存模型 是必须要懂的
优势:
- 部署简单: go编译生成一个静态可执行文件,除了glibc外没有其他外部依赖,这让部署变得异常方便,目标机器上只需要一个基础的系统和必要的管理,监控工具,完全不用操心应用所需的各种包 库的依赖关系,大大减轻维护的负担.
- 并发性好:Goroutine和channel是编写高并发的服务端软件变得相当容易,很多情况下不需要考虑锁机制以及相关的各种问题.单个go应用也能有效的利用多个cpu,并发执行的性能好.
- 良好的语言设计: 从学术角度讲go语言其实非常平庸,不过支持很多高级的语言特征,但从工程角度,go语言的设计十分优秀,规范足够简单灵活,更重要的是go语言自带完善的 工具 链,大大提高团队的协作一致性.
- 执行性能好: 虽然不如c与java,但通常比原生的 python 应用还是高一个数量级的,适合编写一些瓶颈业务,内存占用十分节省.
- 支持[垃圾回收],这属于[动态语言]的特性之一吧,虽然目前来说GC不算完美,但是足以应付我们所能遇到的大多数情况,特别是Go1.1之后的GC。
- 跨平台编译,如果你写的Go代码不包含cgo,那么就可以做到window系统编译 linux 的应用,如何做到的呢?Go引用了[plan9]的代码,这就是不依赖系统的信息。