🐀 Go | Golang 入门

虽然已经用了大半年的 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 月正式宣布推出,成为开放源代码项目,并在LinuxMac 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主要用到两个环境变量GOROOTGOPATH

  • GOROOTgolang编译器和一系列工具链所在的位置(就是刚才解压那个文件的位置,即安装路径)
  • GOROOTgolang的代码和库所在位置(用go get获取代码后所在的位置)
    • 主要包含三个目录bin, pkg, src
      • bin目录主要存放可执行文件
      • pkg目录存放编译好的库文件, 主要是*.a 文件;
      • src目录下主要存放 go 的源文件

此外,还需要给PATH环境变量加上go的可执行文件的位置($GOROOT\bin)

设置好环境变量之后,可以通过go env检查一下是否设置成功

1537512994912

go version查看当前版本

1537513042295

到此,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
2
tar -zxvf go1.11.linux-amd64.tar.gz
mv go /usr/local

设置环境变量,打开~/.bashrc

1
vim ~/.bashrc

在后面添加

1
2
3
export GOROOT=/usr/local/go
export GOPATH=/home/username/gopath
export PATH=$PATH:$GOPATH/bin

然后使其立即生效

1
source ~/.bashrc

然后检查环境变量和版本

1537513539188

到此,Linux下安装成功。

交叉编译安装

有时候,我们机器上的架构恰好官网上没有提供二进制包,那就需要我们下载源码自行安装了。

Go 1.4之后的版本,Go就是实现了自举,所以要想编译1.5及其以后的版本,还需要想要编译安装之前的版本,那样安装好之后就会存在两个版本,这是强迫症所不能忍受的。所以我们可以进行交叉编译

前几天刚刚在Windows下交叉编译了一个armv7go,这里来简单介绍过程。(这里要吐槽一下:官网上有armv8也有armv6就是没有我想要的版本,搞了一个下午才搞好!)

交叉编译就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序。

交叉编译依赖下面几个环境变量:

  • GOARCH 目标平台(编译后的目标平台)的处理器架构(386、amd64、arm)
  • GOOS 目标平台(编译后的目标平台)的操作系统(darwin、freebsd、linux、windows)

对于arm环境,我们还需要指定一下版本

  • GOARM:我这里要编译armv7的版本,自然要将其设置为 7
1
2
3
export GOARCH = arm
export GOOS = linux
export GORAM = 7

然后我们去官网下载源码 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
2
3
4
5
6
7
package main

import "fmt"

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

这里需要注意的是,可执行的包的包名一定是为main

fmtgo里面的标准输入输出的库,我们可以用它来打印字符串到屏幕上。

运行

1
go run ./main.go

这条命令会编译运行一条龙,首先把指定文件编译到一个临时文件夹中,然后再执行。

然后我们就可以看到控制台上的输出Hello, world

1537516323659

编译

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 会从GOPATHvendor文件夹中寻包,我们可以通过设置环境变量GO111MODULE=on来开启支持

go 中的module是根据模块根目录下的go.mod来解决依赖,将下载依赖存放在$GOPATH/pkg/mod之中,而不是之前的直接寻找GOPATHsrc的版本。这种方法可以让我们指定某个项目的特定的依赖版本,使得项目的编译实现reproduceable build

开始使用

初始化

1
go mod init

这条命令会在当前项目目录下新建一个go.mod并指定好模块的名字

生成依赖

1
go mod tidy

执行这条命令之后,go 会根据需要的依赖自动生成require语句,删除不需要的依赖、新增需要的依赖,这个操作不会改变依赖版本。生成之后,我们就可以看到go.mod中有着这个项目所需要的依赖以及他们的版本需要

1537681847857

然后我们可以把相应的版本锁在指定的版本或者要求其大于或小于某个版本。

通过replace甚至可以将一些golang.org的依赖重定向到github.com的镜像源上,那么就不用像以前的版本那样需要一顿复杂的操作了。

例如,只需要在go.mod中加入

1
2
3
replace (
golang.org/x/crypto => github.com/golang/crypto latest
)

开启了模块化功能之后,go get就会自动修改go.mod里面的依赖。

这里就简单介绍一些基本的用法,更多详细的用法可以到这里查看Intro to go modules

总结

入门的文章就写到这里了,更多的详细内容可以去官方文档或者通过gotour进行慢慢学习。

土豪通道
0%