虽然已经用了大半年的 Go,但是这个学期有一门课程又要用到 Go,那么就再来从头开始学一次Golang
吧,安装运行一条龙。
开始
首先,来了解一下golang
是什么。
Go(又称Golang[3])是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。
罗伯特·格瑞史莫,罗勃·派克(Rob Pike)及肯·汤普逊于 2007 年 9 月开始设计 Go,[2],稍后 Ian Lance Taylor、Russ Cox 加入项目。Go 是基于Inferno操作系统所开发的。[4]Go 于 2009 年 11 月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后来追加了 Windows 系统下的实现。[5] 在 2016 年,Go 被软件评价公司 TIOBE 选为“TIOBE 2016 年最佳语言”。[6] 目前,Go 每半年发布一个二级版本(即从 a.x 升级到 a.y)。
– 维基百科
go 语言给我的感觉就是一个实用性很强的语言,没有什么花里胡哨的语法糖,就是最普通最朴素的语法。尤其在服务器领域,写的是十分地舒服。
安装
Windows 下安装
Windows
下安装是十分方便地,官方提供了最新的二进制包,我们只需要从官网上下载就可以了。
目前最新的的Stable
版本是1.11
(2018/9/21),Windows
用户可以下载go1.11.windows-amd64.msi
进行傻瓜式安装,自动帮你设置好一系列的环境变量,但是我个人不太喜欢需要安装的包,更喜欢自己配置。
下载go1.11.windows-amd64.zip
解压到指定的目录(比如,``D:\Coding\Go`,那样重装系统之后只需要重新设置一下环境变量就可以使用了)
设置环境变量:
golang
主要用到两个环境变量GOROOT
和GOPATH
,
GOROOT
:golang
编译器和一系列工具链所在的位置(就是刚才解压那个文件的位置,即安装路径)GOROOT
:golang
的代码和库所在位置(用go get
获取代码后所在的位置)- 主要包含三个目录
bin
,pkg
,src
bin
目录主要存放可执行文件pkg
目录存放编译好的库文件, 主要是*.a 文件;src
目录下主要存放 go 的源文件
- 主要包含三个目录
此外,还需要给PATH
环境变量加上go
的可执行文件的位置($GOROOT\bin
)
设置好环境变量之后,可以通过go env
检查一下是否设置成功
用go version
查看当前版本
到此,Windows 下 Go 环境搭建成功
Linux 下安装
我们平台用到的Linux
一般都是amd64
架构的,这些一般的架构官方都有提供二进制包给我们便捷安装
下载go1.11.linux-amd64.tar.gz
在Linux
下可以用curl
或者wget
下载
1 | wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz |
然后解压到指定的目录
1 | tar -zxvf go1.11.linux-amd64.tar.gz |
设置环境变量,打开~/.bashrc
1 | vim ~/.bashrc |
在后面添加
1 | export GOROOT=/usr/local/go |
然后使其立即生效
1 | source ~/.bashrc |
然后检查环境变量和版本
到此,Linux
下安装成功。
交叉编译安装
有时候,我们机器上的架构恰好官网上没有提供二进制包,那就需要我们下载源码自行安装了。
在Go 1.4
之后的版本,Go
就是实现了自举,所以要想编译1.5
及其以后的版本,还需要想要编译安装之前的版本,那样安装好之后就会存在两个版本,这是强迫症所不能忍受的。所以我们可以进行交叉编译
前几天刚刚在Windows
下交叉编译了一个armv7
的go
,这里来简单介绍过程。(这里要吐槽一下:官网上有armv8
也有armv6
就是没有我想要的版本,搞了一个下午才搞好!)
交叉编译就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序。
交叉编译依赖下面几个环境变量:
GOARCH
目标平台(编译后的目标平台)的处理器架构(386、amd64、arm)GOOS
目标平台(编译后的目标平台)的操作系统(darwin、freebsd、linux、windows)
对于arm
环境,我们还需要指定一下版本
GOARM
:我这里要编译armv7
的版本,自然要将其设置为 7
1 | export GOARCH = arm |
然后我们去官网下载源码 go1.11.src.tar.gz
解压后进入src
目录,运行make.bash
如果机器性能好的话,一般只需要 5 分钟左右就可以编译成功了,然后还需要执行一大堆的测试(我直接终止了)
最后,在bin
目录下就是编译好的版本
需要注意的是,编译好之后的版本。
需要注意的是,如果你是交叉编译,那么bin
下会同时存在你当前环境的版本和目标系统环境的版本,这个需要直接手动清理掉当前环境的版本,然后把bin
文件直接复制到目标平台上就 OK 了。
安装相关工具
用go get
获取github
上的项目是需要依赖于git
的,因此需要保证你的环境中可以调用git
如果你没有梯子的话,当你在get
某些库的时候就会无法下载,那是因为golang.org
在遥远的墙外。
如果你有梯子的话,可以通过export http_proxy=http://ip:port
设置代理。
(注意:go 的代理并不支持sock5
协议,虽然某些版本的ss
自带或者支持http
代理,但是还是不太可靠)
但是这些库在Github上都有镜像,我们可以去手动下载然后移动他们到正确的目录下src\golang\xxx
The easiest way to install is to run
go get -u golang.org/x/net
. You can also manually git clone the repository to$GOPATH/src/golang.org/x/net
.
比如
1 | git clone github.com/golang/tools $GOPATH/src/golang.org/x/ |
Hello, world
安装好一系列的环境,自然是开始一个Hello world
啦
编写一个新的main.go
1 | package main |
这里需要注意的是,可执行的包的包名一定是为main
。
fmt
是go
里面的标准输入输出的库,我们可以用它来打印字符串到屏幕上。
运行
1 | go run ./main.go |
这条命令会编译运行一条龙,首先把指定文件编译到一个临时文件夹中,然后再执行。
然后我们就可以看到控制台上的输出Hello, world
编译
1 | go build ./main.go |
这个命令会将代码编译为一个二进制的单文件,可以直接再当前系统上运行。
Go
语言的一个特性就是它编译出来的程序只需要依赖于当前系统的glibc
,并不像Python
,Java
需要配置一大堆环境。
一些特性
至于Go
的语法,一般都是和一些c-like
语言差不多的,比较明显的不同就是
for
,if
等语句不需要小括号- 没有
while
语句,用for
代替 switch
语句的逻辑和其他语言不同,不需要break
,需要fallthrough
- 语句末尾没有分号
- 用
:=
可以新建一个变量并赋值,不需要声明类型 - 函数的参数的类型在名字的后面,如
(a int)
- 当前版本没有还泛型
- 存在大量的内建函数,如长度的
len()
一般数组的添加和删除操作的append()
Go
的包管理是通过import
进行管理的,官方的推荐是使用src
下的绝对路径而不是相对路径,这样有利于包的更新和管理。
Go Module
go1.11
中提供了对模块的实验性支持,据说go1.12
就会删除掉对GOPATH
的支持,因此最好是了解以下如何使用go module
在go1.11
中,模块的支持的默认关闭的,go 会从GOPATH
和vendor
文件夹中寻包,我们可以通过设置环境变量GO111MODULE=on
来开启支持
go 中的module
是根据模块根目录下的go.mod
来解决依赖,将下载依赖存放在$GOPATH/pkg/mod
之中,而不是之前的直接寻找GOPATH
中src
的版本。这种方法可以让我们指定某个项目的特定的依赖版本,使得项目的编译实现reproduceable build
。
开始使用
初始化
1 | go mod init |
这条命令会在当前项目目录下新建一个go.mod
并指定好模块的名字
生成依赖
1 | go mod tidy |
执行这条命令之后,go 会根据需要的依赖自动生成require
语句,删除不需要的依赖、新增需要的依赖,这个操作不会改变依赖版本。生成之后,我们就可以看到go.mod
中有着这个项目所需要的依赖以及他们的版本需要
然后我们可以把相应的版本锁在指定的版本或者要求其大于或小于某个版本。
通过replace
甚至可以将一些golang.org
的依赖重定向到github.com
的镜像源上,那么就不用像以前的版本那样需要一顿复杂的操作了。
例如,只需要在go.mod
中加入
1 | replace ( |
开启了模块化功能之后,go get
就会自动修改go.mod
里面的依赖。
这里就简单介绍一些基本的用法,更多详细的用法可以到这里查看Intro to go modules
总结
入门的文章就写到这里了,更多的详细内容可以去官方文档或者通过gotour
进行慢慢学习。