环境准备篇
背景
Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。
由罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pike)及肯·汤普逊(Ken Thompson)于2007年9月开始设计,稍后Ian Lance Taylor、Russ Cox加入项目。Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目
Go语言的三位作者,都是业界大神
Robert Griesemer:曾协助制作Java的HotSpot编译器和Chrome浏览器的JavaScript引擎V8
Rob Pike:曾是贝尔实验室的Unix团队和Plan9操作系统计划成员,与Thompson共同创造了UTF-8字符编码
Ken Thompson:是C语言和Unix的创造者。(1983年图灵奖和1988国家技术奖)
近十年来,C++在计算领域没有得到良好发展,其语法复杂,开发效率较低,在多个编程语言的排行中反而低于C语言。C++作为替代C语言的新秀而出现,却没能真正实现这个目标,在市场中越来越低于预期,除了在游戏引擎领域占据主导地位,其他领域很难有存在感。而之所以在游戏引擎领域能占据主导地位,是因为游戏引擎的特殊性,需要一门高性能的面向对象编程语言,唯一的选择只能是C++。C语言开发游戏引擎会非常艰难,代码不易维护,不适用于游戏引擎的业务逻辑,而早期的Java,性能还远远达不到要求,随着Go语言的出现,这一现状正在被改变,用Go语言开发的可适用于生产的游戏引擎已经出现,相信随着Go语言的发展,会有更多的Go语言游戏引擎出现。在Web领域,C++与Go相比更不具备可比性,Go语言在Web领域已开始逐渐抢夺Java的市场。
Go与Java很难分辨优劣,只能说仁者见仁智者见智,短期内也不存在谁替代谁的可能,但给C语言学习者的启发是,C++已经不再是C语言学习者后续晋级学习的最好选择,C语言学习者学习Go语言,反而事半功倍,水到渠成。
具有戏剧性的是,Go语言的诞生,是以上大神一起闲聊吐槽C++多么坑爹时,突然想到不如干脆开发个新的C语言代替C++,于是说干就干,开发了早期的Go语言。可以想见,我们普通人吹了牛逼后也就算了,大神牛逼的地方是把自己吹的牛逼实现了。
Go开发环境搭建
建议在有其他编程语言的基础下学习Go,最好是有C语言基础,Go中虽然弱化了指针,但是仍然提供了指针,即使是Java开发者,也不一定能很好理解指针。相关的知识,可以看看我的 C语言专栏
下载
官网可能需要科学上网才能访问,建议直接访问官方的中文镜像 Go语言中国镜像
根据自己的操作系统,选择对应平台版本下载,本文以Windows为例,因为Linux、MacOS环境搭建都比Windows更简单
环境配置
Windows安装包下载后,选择下一步安装即可。
接下来需要配置环境变量。Windows的环境变量设置方式,请自行谷歌,相信有编程基础的朋友都应该设置过环境变量了。
1. 创建变量名GOROOT
,变量值指向刚刚安装完成后的安装目录(根目录)
2. 创建变量GOPATH
,指向我们存放项目代码的工作空间
3. 创建变量GOBIN
,路径写为%GOROOT%\bin;
4. 最后,将%GOBIN%
加入到系统PATH变量中
2022更新:现在安装Go环境,已无需配置环境变量!在Windows上安装完成,关闭旧的命令行,开启新命令行。
完成环境配置后, 在命令行输入以下命令,检查环境配置是否成功
go version
关于Go语言环境变量的简单说明
GOROOT
:Go的安装目录
GOPATH
:用于Go的第三方Package目录存放,也包括我们的工程源码,这个目录不能指定到Go的安装目录中
GOBIN
:Go二进制文件存放目录,建议写成%GOROOT%\bin;
GOOS
:指定操作系统平台
GOARCH
:指定CPU架构,如:i386表示x86,amd64表示x64
注意:
go1.8版本以后,GOPATH在未设置情况下,会有一个默认值。Unix/Linux/macOS下指向HOME/go
这个目录,在Windows下指向%USERPROFILE%/go
这个目录
通常的,GOPATH
所指定的文件夹下,需要再新建三个子文件夹
src
:存放源代码
pkg
:编译后产生的文件
bin
:编译后生成的可执行文件
说实话,在Go1.11版本之前,它的源码管理是非常混乱的,特别是第三方包依赖。简单说,我们设置好GOPATH
路径后,那么编写的源码就必须放在GOPATH
下的src
目录中,这样非常不灵活,我们不能在任意目录创建工程,否则无法编译。而且我们安装的第三方库也会自动安装到这个src
目录中,这样我们自己的工程和第三方库都混杂在src
目录下,更为要命的是,Go的第三方包没用版本管理,相信有过Java或Python开发经验的人都知道第三方库版本管理是多么重要的事情,但是这些缺陷都在Go1.11版本得到了改变,目前Go的最新版本是1.12,因此建议大家要安装1.12版本的Go。
IDE的选择
-
LiteIDE
目前Go有一个专用IDE是LiteIDE
,它是用Qt开发的,与成熟的IDE相比仍有一些差距,但用于学习是足够了。这个IDE我本人使用过一段时间,其存在偶发的界面卡死情况,实战开发项目时会非常蛋疼,不推荐工程实践。 -
GoLand
这是JetBrains
公司出品的IDE,相信该公司出品的IDE大家都耳熟能详了,例如大名顶顶的Android Studio
,Java后端的IntelliJ IDEA
,还有我最喜欢的最好的Python IDEPyCharm
。而GoLand
唯一的缺点是需要购买,小伙伴们只能绞尽脑汁的找破解了。 -
VSCode
VSCode严格说只能算是编辑器,不过它确实是目前最流行的编辑器之一,轻松胜任各种开发环境,如前端、Flutter开发等,这也是我目前最喜欢的编辑器。其插件庞大,只需装一款Go语言插件就能拥有轻量级IDE的能力。
Go第一行代码
我们打开任意一款心爱的编辑器(记事本除外),写下第一行Go代码,向世界打个招呼
2022更新:
在任意目录下创建hello文件夹,然后在该目录下创建go源文件hello.go
在GOPATH
指定的路径下的src
目录下创建go源码文件hello.go
package main
import "fmt"
func main() {
fmt.Printf("hello,world!\n")
}
在当前目录下打开cmd命令行,输入如下命令编译并执行Go程序
go run hello.go
怎样,以上代码是否看起来和C语言超像,连Printf
函数的用法都和C语言如出一辙,区别只是Go语言中的函数,基本上都是首字母大写。
将Go源代码编译成exe
可执行程序
go build hello.go
可以看到,当前目录下即生成了一个hello.exe
文件
Go语言交叉编译
假如你的朋友使用的是Mac电脑,而你使用的是Windows电脑,那么你编译的exe
可执行程序发给你的朋友是没有任何用处的,因为Windows上的程序是不能在其他系统上运行的。简单的做法是直接将你写好的源代码发给朋友,让他自己去编译Mac上的可执行程序。如果你的朋友不会编译,那么就需要你为他编译一个Mac版的程序。
通常来说,本地只能编译自己平台的程序,如果你要在Windows上编译一个Mac版或者Linux版的程序,这就叫交叉编译,需要使用到交叉编译器。如果是C语言就得你自己去寻找一个可用的交叉编译器,而Go语言则已经自带了交叉编译器,非常方便。这一点意义非常大,使得我们的开发环境可以和生产环境不一样。
现在就编译一个Linux版本的hello world
吧
在cmd命令行中设置临时环境变量,表示目标平台为64位的Linux操作系统
SET GOOS=linux
SET GOARCH=amd64
再次编译
go build hello.go
此时生成了一个不带后缀名的hello
文件,这就是Linux系统的可执行文件,拷贝到Linux服务器上,也可以虚拟机创建一个ubuntu
系统,然后在shell中执行./hello
即可运行。
Go工程管理
在本篇的最后,我们来说一下关于1.11版本的新特性,第三方库的版本管理功能。
1.11版本新增了一个环境变量 GO111MODULE
,它有两个值可以设置,on
或者auto
,建议设置为auto
,让其自动判断。
将以上环境变量设置好之后,我们就可以在任意目录下创建源码工程了,例如
-
在
GOPATH
以外的任意一个目录创建hello
文件夹 -
在
hello
文件夹下创建一个源码,或者将之前的hello.go
拷贝过来 -
在该目录下打开cmd命令行,并执行命令
go mod init hello
初始化 -
接下来就可以执行
go run hello.go
命令运行了。
除了可以在任意目录创建源码工程,还多出了一个第三方库的版本管理功能。执行初始化命令之后,会在项目中生成一个版本管理的文件go.mod
,打开该文件即可查看或设置库的版本,目前我们没有引用一个第三方库,因此只有go 1.12
这一行版本信息。
2022更新:
Go 1.13 及其之后, GO111MODULE 的默认行为 (auto
) 语义变了。当存在 go.mod 文件时或处于 GOPATH 外, 其等同于 GO111MODULE=on
。相当于 Go 1.13之后所有的代码仓库均不用存储在 GOPATH 下。
关于初始化命令的格式
go mod init + 模块名称
要注意,该特性只在1.11
及其之后的版本中可用。