Go语言开发(一)、Go语言简介

一、Go语言简介

1、Go语言简介

Go,全称golang,是Google开发的一种静态强类型、编译型、并发型并具有垃圾回收功能的编程语言。 Go从2007年末由Robert Griesemer、Rob Pike、Ken Thompson(C语言发明者)主持开发,于2009年11月正式宣布成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后续增加了Windows平台的实现。2012年初,Go语言官方发布了Go 1.0稳定版本,目前Go语言基于1.x每半年发布一个版本。

2、Go语言的优点

Go语言优点如下:
A、可直接编译成机器码
B、丰富的标准库支持
C、内置强大的工具
D、支持跨平台编译
E、支持自动垃圾回收
F、更丰富的内置类型支持
G、支持函数多返回值
H、错误处理支持
I、支持匿名函数和闭包
J、支持类型和接口
L、支持并发编程
M、支持反射
N、支持与C语言交互

3、Go语言的缺点

Go语言缺点如下:
A、缺少框架
B、软件包管理不完善

4、Go语言用途

Go语言主要用途如下:
A、服务器编程,如处理日志、数据打包、虚拟机处理、文件系统等
B、分布式系统,数据库代理器等
C、网络编程,如Web应用、API应用、下载应用
D、内存数据库,如groupcache、couchbase的部分组建
E、云平台,目前国外很多云平台在采用Go开发,CloudFoundy的部分组建,前VMare的技术总监自己出来搞的apcera云平台。

二、Go语言环境安装

1、Go语言环境下载

Go语言支持以下系统:
A、Linux
B、FreeBSD
C、Mac OS X(Darwin)
D、Windows
Go语言环境安装包下载地址:
https://golang.org/dl/
https://golang.google.cn/dl/
Go语言开发(一)、Go语言简介
根据操作系统平台下载相应的Go语言环境安装包。

2、Linux平台安装Go语言环境

将下载的源码包解压至/usr/local目录
sudo tar -C /usr/local -xzf go1.10.1.linux-amd64.tar.gz
将 /usr/local/go/bin目录添加至PATH环境变量
export PATH=$PATH:/usr/local/go/bin

3、MAC平台安装Go语言环境

MAC平台可以使用.pkg结尾的安装包直接双击来完成安装,安装目录在 /usr/local/go/下。
brew install go

4、Windows平台安装Go语言环境

Windows平台可以使用.msi 后缀的安装包来安装。
默认情况下.msi文件会安装在c:\Go目录下,可以将 c:\Go\bin目录添加到PATH环境变量中。添加后需要重启命令窗口才能生效。

三、Go命令行工具

1、Go命令简介

Go语言自带有一套完整的命令操作工具,可以通过在命令行中执行go或go help来查看:
Go语言开发(一)、Go语言简介

2、go build

go build命令主要用于测试编译。在包的编译过程中,若有必要,会同时编译与依赖包。
如果是普通包,执行go build命令后不会产生任何文件。
如果是main包,执行go build命令后,会在当前目录下生成一个可执行文件。如果需要在$GOPATH/bin木下生成相应的exe文件,需要执行go install 或者使用 go build -o 路径/a.exe。
如果某个文件夹下有多个文件,而只想编译其中某一个文件,可以在go build之后加上文件名,例如go build a.go。go build命令默认会编译当前目录下的所有go文件。
可以指定编译输出的文件名。比如,可以指定go build -o myapp,默认情况是package名(非main包),或者是第一个源文件的文件名(main包)。
go build会忽略目录下以"_"或者”."开头的go文件。
如果源代码针对不同的操作系统需要不同的处理,那么可以根据不同的操作系统后缀来命名文件。例如有一个读取数组的程序,对于不同的操作系统可能有如下几个源文件:

array_linux.go 
array_darwin.go 
array_windows.go 
array_freebsd.go

go build时会选择性地编译以系统名结尾的文件(Linux、Darwin、Windows、Freebsd)。Linux系统下面编译只会选择array_linux.go文件,其它系统命名后缀文件全部忽略。
如果直接使用,表示试图编译当前目录所对应的代码包,如果当前目录不是一个有效的代码包(包含在 $GOPATH/src 目录下)则会报错;如果带上代码包名,则表示编译指定的代码包;如果带上源码文件,则表示编译指定源码文件。
GO语言的源码文件分为三类,包括命令源码文件、库源码文件和测试源码文件。如果编译的是命令源码文件,或包含命令源码文件的包(main包)时,编译通过后会生成可执行文件;反之则不会生成任何文件,只是做检查性编译。
可以在执行go build命令时,加上一些标记,如:
-v 标记,可以把命令执行过程中构建的包名(包含编译过程中依赖的包)打印出来,如果 go build 的是一个源码文件,则会打印出的包名为 command-line-arguments,这是编译源码文件时生成的虚拟包名,所以看到不用觉得奇怪。
  -x 标记,可以打印编译期间所用到的所有shell命令。
  -o 标记,用来指定生成文件的路径和名称。
  -a 标记,强制重新编译。
  -buildmode=shared标记,指定当前编译生成的结果类型,如静态库和动态库。GO语言默认使用静态编译,好处是部署时非常简单,但使用动态库,可以减少分发包的大小。目前在windows下尚不支持编译成动态库。
  如果是直接使用,表示试图编译当前目录所对应的代码包,如果当前目录不是一个有效的代码包(包含在 $GOPATH/src 目录下)则会报错;如果带上代码包名,则表示编译指定的代码包;如果带上源码文件,则表示编译指定源码文件。

3、go clean

go clean命令用来移除当前源码包里面编译生成的文件,包括:
_obj/ 旧的object目录,由Makefiles遗留
_test/ 旧的test目录,由Makefiles遗留
_testmain.go 旧的gotest文件,由Makefiles遗留
test.out 旧的test记录,由Makefiles遗留
build.out 旧的test记录,由Makefiles遗留
*.[568ao] object文件,由Makefiles遗留
DIR(.exe) 由 go build 产生
DIR.test(.exe) 由 go test -c 产生
MAINFILE(.exe) 由 go build MAINFILE.go产生

4、go fmt

go fmt命令主要用来格式化代码文件。
开发工具一般都带有保存时自动格式化功能,底层其实就是调用了go fmt 命令。
gofmt -w src,可以格式化整个项目。

5、go get

go get命令主要用来动态获取远程代码包,目前支持BitBucket、GitHub、Google Code和Launchpad。go get命令在内部分成两步操作:第一步是下载源码包,第二步是执行go install。下载源码包的go工具会自动根据不同的域名调用不同的源码工具,对应关系如下:

BitBucket (Mercurial Git)
GitHub (Git)
Google Code Project Hosting (Git, Mercurial, Subversion)
Launchpad (Bazaar)

为了go get能正常工作,必须确保安装合适的源码管理工具,并同时把源码管理工具命令加入到PATH中。
go get 命令本质上是首先通过源码工具clone代码到src目录,然后执行go install。

6、go install

go install命令在内部分成两步操作:第一步是生成结果文件(可执行文件或者.a包),第二步会把编译好的结果移到 $GOPATH/pkg 或者$GOPATH/bin。
.exe文件: 一般是go install带main函数的go文件产生的,有函数入口,所有可以直接运行。
.a应用包: 一般是 go install不包含main函数的go文件产生的,没有函数入口,只能被调用。

7、go test

go test命令会自动读取源码目录下面名为*_test.go的文件,生成并运行测试用的可执行文件。
默认不需要任何参数,go test命令会自动把源码包里所有test文件测试完毕,帮助信息可以使用go help testflag查看。
进行单元测试的工具,单元测试代码建议与被测试代码放在同一个代码包中,并以 "_test.go" 为后缀,测试函数建议以"Test"为名称前缀。go test命令可以对代码包进行测试,也可以指定某个测试代码文件运行(要一并带上被测试代码文件)

8、go doc

go doc命令是一个很强大的文档工具,用于查看文档,如查看builti包执行go doc builtin,查看http包执行go doc net/http。查看某一个包里的函数,执行go doc fmt Printf,也可以查看函数相应的代码,执行go doc -src fmt Printf。
通过命令在命令行执行godoc -http=:端口号,比如godoc -http=:8080。然后在浏览器中打开127.0.0.1:8080,会看到一个golang.org的本地copy版本,通过网页可以查询pk文档等其它内容。如果设置了GOPATH,pkg分类下会列出标准包的文档,本地GOPATH中所有项目的相关文档。

9、go fix

go fix用来修复老版本的代码到新版本,例如go1前老版本的代码转化到go1。

10、go version

go version命令用于查看go当前的版本。

11、go env

go env命令用于查看当前go的环境变量,用于打印GO语言的环境信息,如GOPATH是工作区目录,GOROOT是GO语言安装目录,GOBIN是通过go install命令生成可执行文件的存放目录(默认是当前工作区的bin目录下),GOEXE为生成可执行文件的后缀。

12、go list

go list命令用于列出当前全部安装的package。

13、go run

go run命令用于编译并运行Go程序,只能作用于命令源码文件,一般用于开发中快速测试。

14、go tool

go tool命令工具,go tool pprof性能检查工具,   go tool cgo跟C语言和GO语言有关的命令。

15、go vet

go vet是静态检查工具,用于一般项目快完成时进行进行优化。

16、go bug

go bug命令用于GO语言调试。

17、go generate

通过扫描Go源码中的特殊注释来识别要运行的常规命令。go generate不是go build的一部分,go generate不包含依赖关系分析,必须在运行go build前显式运行。go generate由Go package的作者使用,而不是其客户端。

18、go help

go help xx命令用于查看帮助信息,如go help bug用于查看go bug的帮助信息。

四、Go语言开发环境

1、LiteIDE

LiteIDE是一款开源、跨平台的轻量级Go语言集成开发环境(IDE)。
下载地址 :http://sourceforge.net/projects/liteide/files/
源码地址 :https://github.com/visualfc/liteide
Go语言开发(一)、Go语言简介

2、GoLand

Goland是由捷克JetBrains公司旨在为go开发者提供的一个符合人体工程学的新的商业IDE。Goland整合了IntelliJ平台的有关go语言的编码辅助功能和工具集成特点,特点如下:
A、编码辅助功能
Goland会分析开发者代码,在符号之间寻找连接。提供代码提示,快速导航,灵活的错误分析能力以及格式化和重构功能。
B、符合人体工程学的设计
强大的静态代码分析能力和符合人体工程学的设计,使开发者不仅仅是在工作,更是一种愉快的编程体验。
C、工具的集成
关键任务工具,例如代码覆盖工具,功能齐全的调试器和版本控制都集成在一起,而不会有一些随意安装的插件。
D、IntelliJ插件生态系统
除了丰富的内置工具,如果需要任何东西,在IntelliJ插件生态系统中都可以找到。
官方网址:https://www.jetbrains.com/go/
Goland安装完后需要对Go开发环境进行配置。
Go语言开发(一)、Go语言简介
点击Configure->Settings菜单,配置如下:
Go语言开发(一)、Go语言简介

五、Go语言示例

1、helloworld.go编写

package main
import "fmt"

func main() {
   fmt.Println("Hello, World!")}

2、编译执行

go run helloworld.go
打印出:Hello, World!