1、Go 语言的诞生
Go语言是一门新型的静态类型的编译型语言。
每种语言都有其独特的应用领域,在某个领域使用某种语言能达到收益/投入的最大化。例如,在嵌入式领域,汇编语言和C语言是首选;在操作系统领域,C语言是首选;在系统级服务编程领域,C++是首选;在企业级应用程序和Web应用领域,Java是首选。
最近几年,由于C和C++在计算领域没有得到很好的发展,也没有出现新的、好用的系统编程语言,因此使得开发程度和系统效率等在很多情况下不能兼容。当执行效率较高时,就存在低效的开发和编译,如C++;当执行效率低时,但拥有有效的编译,如.NET、Java等。根据以上情况,就需要一种既有较高效的执行速度,又有高效的编译速度和开发速度的编程语言,因此Go语言就诞生了。
Go语言是由Google公司推出的一个开源项目(系统开发语言),它是基于编译、垃圾收集和并发的编程语言。Go语言最早是在2007年9月由Robert Griesemer、Rob Pike和Ken Thompson联合开发的,2009年11月,Google正式发布Go语言,并将其开源在BSD许可证下发行。
Go语言不仅支持Linux和Mac OS平台,还支持Windows平台。Go语言就是为了解决当下编程语言对并发支持不友好、编译速度慢、编程复杂等问题而诞生的。
2、Go 语言的特性
Go语言是由Google公司开发的一种静态型、编译型并自带垃圾回收和并发的编程语言。
Go语言与当前的传统开发语言(如Java、PHP)相比具备许多新特性。例如,Go语言拥有自动垃圾回收功能,同时也允许开发人员干预回收操作;Go语言有着更加丰富的内置类型,在错误处理方面语法更加精简高效。在Go语言中,函数支持多个返回值,而且函数也是一种值类型,可以作为参数传递。
a. 简单易学
Go语言的风格类似于C语言。其语法在C语言的基础上进行了大幅简化,去掉了不需要的表达式括号,循环也只有for一种表示方法,就可以实现数值、键值等各种遍历。因此,Go语言非常容易上手。
b. 系统类型和抽象
Go语言的类型定义参考了C语言中的结构(struct),但是Go语言并不像C++和Java那样设计一个庞大而又复杂的类型系统,而是仅支持最基本的类型组合,不支持继承和重载。虽然Go语言没有类和继承的概念,但是它可以通过接口(interface)的概念来实现多态性。
c. 工程结构简单
Go语言不像C语言那样需要头文件才能运行,Go语言编译的文件都来自扩展名为go的源码文件,Go语言还不需要解决方案、工程文件及Make File。由于Go语言遵循GOPATH规则,因此,只需要将Go语言的工程文件按照GOPATH的规则进行填充即可,最后使用go build或go install进行编译。
d. 快速编译
Go语言和其他语言一样,拥有一个健全的包管理机制,同时得益于包之间的树状依赖,Go语言的初次编译速度可以和C/C++相媲美,甚至二次编译的速度明显快于C/C++,同时又拥有接近Python等解释语言的简洁和开发效率。Go语言在执行速度、编译速度和开发效率之间做了权衡,尽量达到了快速编译、高效执行、易于开发的目标。
同时,Go语言还支持交叉编译,可以在运行Linux系统的计算机上开发Windows下的应用程序。Go语言源码文件格式默认都是使用UTF-8编码的。
e. 原生支持并发
Go语言最有特色的特性就是从语言层支持并发,不需要第三方库、开发者的编程技巧及开发经验就可以轻松地在Go语言运行时来帮助开发者决定如何使用CPU资源。Go语言在语言层可以通过goroutine对函数实现并发执行。goroutine类似于线程但是并非线程,goroutine会在Go语言运行时进行自动调度。因此,Go语言非常适合用于高并发网络服务的编写。
Go语言对多核处理器的编程进行了优化,Go语言从程序与结构方面来实现并发编程,这是Go语言最重要的特性之一。
f. 开源免费
由于Go语言是基于BSD协议完全开源的,因此能免费被任何人用于适合的商业目的。
3、Go 使用场景
使用Go语言,可以让Web服务器端的开发变得更高效,能够充分发挥多核计算机的性能,拥有更出色的网络环境兼容能力。自动垃圾回收、类型安全、依赖严格、编译快速等特点都是Go语言的魅力所在。很显然,Go语言的目标就是针对服务器端的Web开发领域。
Go语言凭借其出色的并发能力,在高性能分布式系统领域如鱼得水,像集群系统、游戏服务器端等场景都可以把Go语言作为首选开发语言。但是,Go语言并不适合开发强实时性的软件,垃圾回收和自动内存分配等因素导致Go语言在实时性上有些力不从心。
对于Go语言最初的构想是把它作为一个系统编程语言,但目前也被用于像Web Server、存储架构等这类分布式、高并发系统中;同时还可以用于一般的文字处理和作为脚本程序使用。
Go语言的编译器作为Native Client被内嵌到Chrome浏览器中,可以被Web应用程序用来执行本地代码;同时Go语言也可以运行在Intel和ARM处理器上。
目前,Go语言已被Google集成到Google APP Engine中,在基于Google App Engine基础设施的Web应用中也得到了很好的应用。
4、Go 环境部署
Go安装包的下载地址为All releases - The Go Programming Language。
Go语言主要支持Windows、Linux及Mac OS操作系统:
环境变量:
与Java等编程语言一样,安装Go语言开发环境需要设置全局的操作系统环境变量(除非使用包管理工具直接安装)。
主要的系统级别的环境变量有以下两个:
- GOROOT:表示Go语言环境在计算机上的安装位置,它的值可以是任意的位置,这个变量只有一个值,值的内容必须是绝对路径。
- GOPATH:表示Go语言的工作目录,可以有多个,类似于工作空间。一般不建议将GOPATH和GOROOT设置为同一个目录。
5、Go 开发工具
Gogland
由于Gogland是Jebrains家族的一员,所以,要使Gogland能够正常工作,必须安装Java并配置JDK或JRE环境,同时还需要手动配置GOPATH。
Visual Studio Code
安装Go语言扩展:选择View|Extensions命令
6、GOROOT 目录结构
a. api文件夹
api文件夹中存放了Go API检查器的辅助文件,包括公开的变量、常量及函数等。其中,go1.1.txt、go1.2.txt、go1.3.txt和go1.txt文件分别存放了不同版本的Go语言的全部API特征;except.txt文件中存放了一些(在不破坏兼容性的前提下)可能会消失的API特性;next.txt文件则存放了可能在下一个版本中添加的新API特性。
b. bin文件夹
bin文件夹中存放了所有由官方提供的Go语言相关工具的可执行文件。默认情况下,该目录会包含go和gofmt这两个工具。
c. doc文件夹
doc文件夹中存放了Go语言几乎全部HTML格式的官方文档和说明,方便开发者在离线时查看。
d. lib文件夹
lib文件夹中存放引用的库文件,可以为程序的运行提供帮助。
e. misc文件夹
misc文件夹中存放各类编辑器或IDE(集成开发环境)软件的插件,辅助开发者查看和编写Go语言代码。
f. pkg文件夹
pkg文件夹用于在构建安装后,保存Go语言标准库的所有归档文件。pkg文件夹包含一个与Go语言安装平台相关的子目录,被称为“平台相关目录”。例如,Windows 64bit操作系统的安装包中,平台相关目录的名字则为windows_amd64。Go源码文件对应于以“.a”为结尾的归档文件,存储在pkg文件夹下的平台相关目录中。
pkg文件夹下还有一个名为tool的子文件夹,该子文件夹下也有一个平台相关目录,其中存放了很多可执行文件。
g. src文件夹
src文件夹中存放了所有的标准库、Go语言工具及相关底层库(C语言实现)的源码。通过查看src文件夹,可以了解Go语言的方方面面。
h. test文件夹
test文件夹中存放了测试Go语言自身代码的文件。通过阅读这些测试文件,可以了解Go语言的特性和使用方法。
7、GOPATH 目录结构
a. src 目录
src目录主要用于以代码包的形式组织并保存Go源码文件。代码包与src的子目录相对应。例如,若一个源码文件被声明为属于代码包logging,那么它就应当被保存在src目录下名为logging的子目录中。当然,也可以把Go源码文件直接放在src目录下,但这样的Go源码文件就只能被声明为属于main的代码包。一般建议把Go源码文件放入特定的代码包中。
注意:Go语言的源码文件分为3类,即Go库源码文件、Go命令源码文件和Go测试源码文件。Go语言的命令源码文件和库源码文件的区别如下:所谓命令源码文件,就是声明为属于main代码包,并且包含无参数声明和结果声明的main函数的源码文件。这类源码文件可以独立运行(使用go run命令),也可被go build或go install命令转换为可执行文件。库源码文件则是指存在于某个代码包中的普通源码文件。
b. pkg 目录
pkg目录主要用于存放经由go install命令构建安装后的代码包(包含Go库源码文件)的“.a”归档文件。该目录与GOROOT目录下的pkg功能类似。区别在于,GOPATH结构中的pkg目录专门用来存放程序开发者代码的归档文件。构建和安装用户源码的过程一般会以代码包为单位进行,例如,logging包被编译安装后,将生成一个名为logging.a的归档文件,并存放在当前工作区的pkg目录下的平台相关目录中。
c. bin 目录
bin目录与pkg目录类似,在通过go install命令完成安装后,保存由Go命令源码文件生成的可执行文件。在Linux操作系统下,这个可执行文件一般是一个与源码文件同名的文件。而在Windows操作系统下,这个可执行文件的名称是源码文件名称加.exe。
8、Go 第一个程序
package main
import "fmt"
func main() {
fmt.Println("Hello world!") // shift+alt+down 复制当前行到下一行
}
- 编译文件:
go build hello.go
编译后默认生成对应的.exe
文件。也可以指定文件名:go build -o filename
- 运行文件:
hello.exe
或者直接使用go run hello.go
Go语言程序规则:
- 源程序以.go为扩展名。
- 源程序默认为UTF-8编码。
- 标识符区分大小写。
- 语句结尾的分号可以省略。
- 函数以func开头,函数体开头的“{”必须在函数头所在的行尾部,不能单独起一行。
- 字符串字面量使用“" "”(双引号)括起来。
- 调用包中的方法通过“.”访问符,如fmt.Printf。
- main函数所在的包名必须是main