Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种计算机高级编程语言。
Go的官方文档:https://golang.org
Go的中文api文档: https://studygolang.com/pkgdoc
Go中文社区网站: https://studygolang.com/
在go退推出之前,已经存在很多高级编程语言了,比如:C、C++、C#、Java…。为什么还要再造一个GO呢?
主要原因有三个:
1> 计算机硬件技术更新频繁,性能提高很快。但是主流的编程语言发展明显落后于硬件,不能合理利用多核多CPU的优势提升软件系统性能。 旧的编程语言无法在开发效率与执行效率之间做出很好的平衡:
整体来看各个语言的执行效率和开发效率:
Go语言的诞生一方面便是为了同时拥有高效的执行速度、编译速度和开发速度。
2> 软件系统复杂度越来越高,维护成本越来越高,缺乏一个足够简洁高效的编程语言。
3> 企业运行维护很多c/c++的项目,c/c++程序运行速度虽然很快,但是编译速度确很慢,同时还存在内存泄漏的一系列的困扰需要解决。
针对上述问题,谷歌公司的三位工程师于 2007 年 9 月 20 号下午进行一次讨论,正是这次讨论才有了第二天组织在位于加利福尼亚的山景城 43 号楼的三人会议。这与会的三人正是Go 的创始人:Robert Griesemer,Rob Pike 和 Ken Thompson。这三个神仙主要成就如下:
在Go的官网(https://go.dev/solutions/google/)上有Rob Pike的一段话,讲述了Go的诞生、发版、现状(2020年):
为什么官方叫Golang,而大家都在说它是Go呢?
有意思的是:Google 在注册 Go 的官网域名时,go.org域名已经被迪士尼注册。替而代之:golang.org域名才被使用。这也导致很多人误以为 Golang 是其正式名称;然而我们仅可以认为Golang是Go的一个绰号。
Go 语言起源于2007 年9月,2009年11月Google公司正式发布Go语言,并以BSD协议完全开源,2012年3月 go1.0发布,2015年8月go1.5版本发布(历史性的节点,完全移除C语言部分,使用GO编译GO)。当前最新的版本为go1.20。所有的发版节点(传送链接)如下:
此外,在GO语言的版本迭代过程中,语言特性基本上没有太大的变化,基本上维持在GO1.1的基准上;并且官方承诺,新版本对老版本下开发的代码完全兼容。
近2-3年GO语言在语言排行榜(https://www.tiobe.com/tiobe-index/)上的名次比较固定(第12位左右):
整体语言使用率趋势如下:
GO的核心设计很简单就是为了简单:“keep it simple”,其追求简单实用的哲学,从语言的层面上减少代码的复杂度。
比如:隐式接口&切片、类的弱化、指针的弱化、简洁高效的开发。
GO相对其他语法来说,最大的特点:并发。
其原生支持并发编程。Go 语言的对网络通信、并发和并行编程的支持度极高,从而可以更好地利用大量的分布式和多核的计算机。
开发者可以通过 goroutine 这种轻量级线程的概念来实现这个目标,然后通过 channel 来实现各个 goroutine 之间的通信。他们实现了分段栈增长和 goroutine 在线程基础上多路复用技术的自动化。
后续扩展GO的编程模型(GMP)。
不过GO也有很多面向对象语言的特性没有给以支持:
同C、C++一样,Go语言也是编译型的语言,它直接将人类可读的代码编译成了处理器可以直接运行的二进制文件,执行效率更高,性能更好。
根据 Go 开发团队和基本的算法测试,于 2013 年 3 月 28 日之前统计结果得出,Go 语言与 C 语言的性能差距大概在 10%~20% 之间。
保守估计在相同的环境和执行目标的情况下,Go 程序比 Java 或 Scala 应用程序要快上 2 倍,并比这两门语言使用少占用 70% 的内存。
金花鼠(Gordon)
1> 跨平台?
2> 代码风格?
3> 并发性能(底层CPU的利用)?
计算机编程语言按照运行方式可以分为:编译型语言、解释型语言。
Go是一种编译型语言,运行在不同的平台需要打包成不同操作系统类型下的可执行文件。
而Java既不是完全的编译型语言,也不是完全的解释型语言,它属于半编译、半解释型语言。
1> 引用类型参数传递
2> 面向对象特性
更多微观层面 Go 和 Java语言使用上的一些区别,见专栏的后续文章。
编程语言只是一种工具,没有最好的,只有最合适的。
1、服务器编程。和Java一样,Go语言最多的应用场景就是服务器后端系统的开发,例如:微服务系统开发(Web应用、API应用)、处理日志、数据打包、虚拟机处理、文件系统等。
2、分布式系统开发。比如:集群系统、游戏服务器、数据库代理器、中间件等场景。
3、网络编程。Go非常适用需要高性能高并发的网络编程,用Socket相互传输数据的系统,类似于Java中Netty的用途。
4、云原生平台(运维管理系统)开发。目前国外很多云平台都采用Go开发,比如:Docker,K8s、以及很多DevOps平台。
5、游戏系统开发。
6、区块链开发。GO语言是区块链的第一开发语言。
Go语言不适合的场景为:
云原生技术中代表性的技术:docker、kubernetes、Prometheus、etcd、consul都是使用GO开发的。
笔者研究Go也正是为了看这几个技术的源码。
本文主要介绍了Golang的一些常识。
专栏将类比着Java介绍Go语言的使用,并以此展开对后续云原生开源技术的实践、源码阅读。
下一篇文章继续GO环境的搭建、Hello World代码的运行和运行原理。