2. GoLang开发环境搭建

在开始安装之前,大概说下不同的操作系统的具体使用场景

  1. 在windows环境下,通过界面化的IDE完成代码的编写;

  2. 代码提交至Git仓库,这里的仓库可能是公共服务Gitee、Github,也可能是公司或个人的私有仓库;

  3. 通过流水线或手工拉取代码到Linux服务器上(或者是容器内部);

  4. 在Linux环境完成代码的编译、运行。

2.1. Go解释器安装

重要

Go语言1.14版本之后推荐使用go modules管理依赖,也不再需要把代码写在GOPATH目录下了

Go官网下载地址

Go官方镜像站(推荐)

image-20211113085500041

2.1.1. 安装步骤

小技巧

此安装实例以 64位Win10系统安装 Go1.17.3可执行文件版本为例

将上一步选好的安装包下载到本地

双击下载好的文件,然后按照下图的步骤安装即可。

image-20211113090233658

image-20211113090250780

image-20211113090649279

image-20211113090706316

image-20211113090743808

image-20211113090757412

至此,Windows环境已经安装完成了Go解释器。

去指定的目前下,一般会存在以下文件目录

image-20211117113951879

api

Sgo语言的api存放目录

bin

存放go的二进制命令,一般包括go和gofmt

lib

go

misc

pkg

存放编译后的包文件

src

存放项目源文件

注解

Windows安装完成后会自动添加GOROOT、GOPATH和Path环境变量,但是GOPATH我们很可能需要修改成自定义的

  • WIN+R,打开运行窗口。输入sysdm.cpl,回车img

  • 切换到高级页签,点击环境变量,即可进入环境变量管理界面。

    img

检查

上一步安装过程执行完毕后,Win+R 在弹窗输入cmd打开终端窗口,输入go version命令,查看安装的Go版本。

image-20211113091223854

如果不是要在Linux平台敲go代码就不需要在Linux平台安装Go,我们开发机上写好的go代码只需要跨平台编译(详见末尾的跨平台编译)好之后就可以拷贝到Linux服务器上运行了,这也是go程序跨平台易部署的优势

我们在版本选择页面选择并下载好go1.17.3.linux-amd64.tar.gz文件:

# wget https://golang.google.cn/dl/go1.17.3.linux-amd64.tar.gz

将下载好的文件解压到/usr/local目录下:

# tar -zxvf go1.17.3.linux-amd64.tar.gz -C /usr/local  

执行完就可以在/usr/local/下看到go目录了。

image-20211113092311403

配置环境变量

Linux下有两个文件可以配置环境变量,其中/etc/profile是对所有用户生效的;$HOME/.profile是对当前用户生效的,根据自己的情况自行选择一个文件打开,添加如下两行代码

cat >> /etc/profile << 'EOF'
export GOROOT=/usr/local/go  // 可以完全自定义
export GOPATH=/data/go_path  // 可以完全自定义
export PATH=$PATH:$GOROOT/bin::$GOPATH/bin
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
EOF

source 该文件,使环境变量生效

# source /etc/profile

** 检查**

# go version
go version go1.17.3 linux/amd64

下载可执行文件版,直接点击下一步安装即可,默认会将go安装到/usr/local/go目录下。Mac安装Go

可以执行下面的命令修改GOPROXY:

go env -w GOPROXY=https://goproxy.cn,direct

2.2. 环境变量说明

2.2.1. GOROOT和GOPATH

  • GOROOT

    是go解释器的安装目录,go原生的工具也在该目录下,例如gofmt

  • GOPATH

    通常存放自己开发的代码(gomod未启用)或者一些第三方依赖库,在GOPATH目录下通常会建src、pkg和bin三个文件夹

2.2.2. Go Modules

go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。

2.2.2.1. GO111MODULE

要启用go module支持首先要设置环境变量GO111MODULE,通过它可以开启或关闭模块支持,它有三个可选值:offonauto,默认值是auto

  1. GO111MODULE=off禁用模块支持,编译时会从GOPATHvendor文件夹中查找包。

  2. GO111MODULE=on启用模块支持,编译时会忽略GOPATHvendor文件夹,只根据 go.mod下载依赖。

  3. GO111MODULE=auto,当项目在$GOPATH/src外且项目根目录有go.mod文件时,开启模块支持。

简单来说,设置GO111MODULE=on之后就可以使用go module了,以后就没有必要在GOPATH中创建项目了,并且还能够很好的管理项目依赖的第三方包信息。

使用 go module 管理依赖后会在项目根目录下生成两个文件go.modgo.sum

Go Modules模式下并不兼容GOPATH模式, 之前在GOPATH下运行的包,在GOMODULE模式下无法运行,比如:

$ go run main.go
main.go:3:8: package day1/compile/pkg is not in GOROOT (C:\Program Files\Go\src\day1\compile\pkg)

因此如果你有GOPATH的项目需要维护是,建议将GO111MODULE设置为auto

go env -w GO111MODULE=auto

2.2.3. GOPROXY (非常重要)

下载依赖库时走哪个镜像代理站。

默认GoPROXY配置是:GOPROXY=https://proxy.golang.org,direct,由于国内访问不到。

这里推荐使用https://goproxy.iohttps://goproxy.cn

2.2.3.1. GOPRIVATE

通常,GoLang项目会同时使用开源和私有模块。一些用户使用GOPRIVATE环境变量来指定一个必须绕过GOPROXYGOSUMDB的路径列表,并直接从私有repos下载私有模块

小技巧

“direct” 为特殊指示符,用于指示 Go 回源到模块版本的源地址去抓取(比如 GitHub 等),当值列表中上一个 Go module proxy 返回 404 或 410 错误时,Go 自动尝试列表中的下一个,遇见 “direct” 时回源

项目内使用了GOPRIVATE的依赖时,必须设置direct,否则无法拉取GOPRIVATE的包

2.3. Go开发编辑器安装

Go采用的是UTF-8编码的文本文件存放源代码,理论上使用任何一款文本编辑器都可以做Go语言开发,这里推荐使用VS CodeGolandVS Code是微软开源的编辑器,而Goland是jetbrains出品的付费IDE

我们这里使用VS Code 加插件做为go语言的开发工具。

2.3.1. VS Code介绍

VS Code全称Visual Studio Code,是微软公司开源的一款免费现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比 Diff、GIT 等特性,支持插件扩展,支持 Win、Mac 以及 Linux平台。

虽然不如某些IDE功能强大,但是它添加Go扩展插件后已经足够胜任我们日常的Go开发。

2.3.2. 下载与安装

VS Code官方下载地址:https://code.visualstudio.com/Download

image-20211113094144982

三大主流平台都支持,请根据自己的电脑平台选择对应的安装包。

此安装实例以 64位Win10系统安装 vscode-1.16.2为例。

image-20211113094357545

双击下载好的安装文件,即可开始安装。

image-20211113094523811

image-20211113094605362

image-20211113094622323

image-20211113094645049

image-20211113094703962

image-20211113094743493

2.3.3. 配置

2.3.3.1. 安装中文简体插件

点击左侧菜单栏最后一项管理扩展,在搜索框中输入chinese ,选中结果列表第一项,点击install安装。

安装完毕后右下角会提示重启VS Code,重启之后你的VS Code就显示中文啦!安装简体中文插件

VSCode主界面介绍:vscode_menu

2.3.3.2. 安装go扩展

现在我们要为我们的VS Code编辑器安装Go扩展插件,让它支持Go语言开发。

点击左侧菜单栏最后一项管理扩展,在搜索框中输入Go ,选中结果列表第一项,点击install安装。

image-20211113095115056

2.4. 第一个Go程序

2.4.1. Hello World

现在我们来创建第一个Go项目——hello。在自定义位置创建一个hello目录,并通过VS Code打开该目录。

image-20211113095606549

image-20211113095742092

image-20211113095919311

2.4.1.1. go mod init

使用go module模式新建项目时,我们需要通过go mod init 项目名命令对项目进行初始化,该命令会在项目根目录下生成go.mod文件。例如,我们使用hello作为我们第一个Go项目的名称,执行如下命令。

go mod init hello

image-20211113100220440

2.4.1.2. 编写代码

接下来在该目录中创建一个main.go文件:

package main  // 声明 main 包,表明当前是一个可执行程序

import "fmt"  // 导入内置 fmt 包

func main(){  // main函数,是程序执行的入口
	fmt.Println("Hello World!")  // 在终端打印 Hello World!
}

重要

如果此时VS Code右下角弹出提示让你安装插件,务必点 install all 进行安装

2.4.2. 编译

go build命令表示将源代码编译成可执行文件。

在hello目录下执行:

go build

或者在其他目录执行以下命令:

go build hello

image-20211113101622029

go编译器会去 GOPATH的src目录下查找你要编译的hello项目

编译得到的可执行文件会保存在执行编译命令的当前目录下,如果是windows平台会在当前目录下找到hello.exe可执行文件。

可在终端直接执行该hello.exe文件:

PS E:\GoPro\Code\hello> ./hello.exehello world!

我们还可以使用-o参数来指定编译后得到的可执行文件的名字。

go build -o heiheihei.exe

2.4.3. Windows下VSCode切换cmd.exe作为默认终端

如果你打开VS Code的终端界面出现如下图场景(注意观察红框圈中部分),那么你的VS Code此时正使用powershell作为默认终端:

image-20211113103214116

十分推荐你按照下面的步骤,选择cmd.exe作为默认的终端工具:

image-20211113103345946

如果没有出现下拉三角,也没有关系,按下Ctrl+Shift+P,VS Code正上方会出现一个框,你按照下图输入shell,然后点击指定选项即可出现上面的界面了。

2.4.4. go run

go run main.go也可以执行程序,该命令本质上也是先编译再执行

2.4.5. go install

go install表示安装的意思,它先编译源代码得到可执行文件,然后将可执行文件移动到GOPATHbin目录下。因为我们的环境变量中配置了GOPATH下的bin目录,所以我们就可以在任意地方直接执行可执行文件了。

2.4.6. 跨平台编译

默认我们go build的可执行文件都是当前操作系统可执行的文件,Go语言支持跨平台编译–在当前平台(例如Windows)下编译其他平台(例如Linux)的可执行文件。

2.4.6.1. Windows编译Linux可执行文件

如果我想在Windows下编译一个Linux下可执行文件,那需要怎么做呢?只需要在编译时指定目标操作系统的平台和处理器架构即可。

注意:无论你在Windows电脑上使用VsCode编辑器还是Goland编辑器,都要注意你使用的终端类型,因为不同的终端下命令不一样!!!目前的Windows通常默认使用的是PowerShell终端。

如果你的Windows使用的是cmd,那么按如下方式指定环境变量。

SET CGO_ENABLED=0  // 禁用CGOSET GOOS=linux  // 目标平台是linuxSET GOARCH=amd64  // 目标处理器架构是amd64

注意,输入的时候不能在后面有空格,否则会出现cmd/go: unsupported GOOS/GOARCH pair linux/amd64 报错

如果你的Windows使用的是PowerShell终端,那么设置环境变量的语法为

$ENV:CGO_ENABLED=0$ENV:GOOS="linux"$ENV:GOARCH="amd64"

在你的Windows终端下执行完上述命令后,再执行下面的命令,得到的就是能够在Linux平台运行的可执行文件了。

go build

2.4.6.2. Windows编译Mac可执行文件

Windows下编译Mac平台64位可执行程序:

cmd终端下执行:

SET CGO_ENABLED=0SET GOOS=darwinSET GOARCH=amd64go build

PowerShell终端下执行:

$ENV:CGO_ENABLED=0$ENV:GOOS="darwin"$ENV:GOARCH="amd64"go build

2.4.6.3. Mac编译Linux可执行文件

Mac电脑编译得到Linux平台64位可执行程序:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

2.4.6.4. Mac编译Windows可执行文件

Mac电脑编译得到Windows平台64位可执行程序:

CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

2.4.6.5. Linux编译Mac可执行文件

Linux平台下编译Mac平台64位可执行程序:

CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build

2.4.6.6. Linux编译Windows可执行文件

Linux平台下编译Windows平台64位可执行程序:

CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

现在,开启你的Go语言学习之旅吧。人生苦短,我用GoLang~

2.5. 如何创建一个Go Modules工程

  1. 新建一个目录(不要在GOPATH下创建)

mkdir {your_project_workspace}

2.使用go mod 初始化工程

你当前的目录仅仅是一个目录, 并不是一个go mod工程, 我们通过go mod init {name} 将你的目录初始化为一个go mod工程

cd {your_project_workspace}
go mod init {your_project_workspace}

这样 你该目录下就生产一个go.mod的文件, 现在已经是一个go mod工程了

3.打开工程

使用vscode打开你的{your_project_workspace}文件夹, 然后你就可以在该工程下面 写程序了

2.5.1. go.mod

go.mod文件记录了项目所有的依赖信息,其结构大致如下:

module hello

go 1.17

require (
	github.com/kr/fs v0.1.0 // indirect
	github.com/kr/pretty v0.3.0 // indirect
	github.com/kr/text v0.2.0 // indirect
	github.com/pmezard/go-difflib v1.0.0 // indirect
	github.com/rogpeppe/go-internal v1.6.1 // indirect
	github.com/tools/godep v0.0.0-20180126220526-ce0bfadeb516 // indirect
	golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e // indirect
	golang.org/x/tools v0.1.7 // indirect
)

其中,

  • module用来定义包名

  • require用来定义依赖包及版本

  • indirect表示间接引用

2.5.2. go mod命令

常用的go mod命令如下:

go mod download    下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit        编辑go.mod文件
go mod graph       打印模块依赖图
go mod init        初始化当前文件夹, 创建go.mod文件
go mod tidy        增加缺少的module,删除无用的module
go mod vendor      将依赖复制到vendor下
go mod verify      校验依赖
go mod why         解释为什么需要依赖

2.5.3. 设置你的工作目录

该课件里面包含课程演示过程中的所有代码, 都放置于根目录:

day1
day2
...

1.拉取代码到本地(注意: 不要拉到GOPATH目录下, 因为GOPATH本身就是一个工程, 而该演示目录是一个Go Module工程, 二个工程要分开存放,并单独打开)

mkdir {your_gomod_workspace} // 创建一个目录用于存放你所有的go mod工程
cd {your_gomod_workspace}    // 进入到这个目录
git clone https://gitee.com/xxx/xxxx.git // 把这个工程 clone到你的目录

2.使用vscode 打开该工程, 更多关于vscode 设置打开工程的文档请参考: vscode workspace setting

注意: vscode一次只能打开一个工程, 所以你vscode需要打的目录是: {your_gomod_workspace}/xxx)

3.运行代码示例

运行示例: vscode_go_test_run

由于直接运行时,不会打印fmt.Print的信息, 我们需要如下配置vscode 才可以

4.配置vscode打印run test详情内容

  • 首先安装gotest

     get -u github.com/cweill/gotests
    ---
    go: downloading golang.org/x/tools v0.1.8
    go: downloading golang.org/x/mod v0.5.1
    go: downloading golang.org/x/sys v0.0.0-20211210111614-af8b64212486
    go get: added github.com/cweill/gotests v1.6.0
    go get: added golang.org/x/mod v0.5.1
    go get: added golang.org/x/sys v0.0.0-20211210111614-af8b64212486
    go get: added golang.org/x/tools v0.1.8
    go get: added golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1
    
  • VS-Code中的安装插件

    image-20211211011512017

  • 通过修改 go.testFlags 的配置值为: [“-v”], 就开启了test 打印详细日志功能

    {
        "workbench.colorTheme": "One Dark Pro",
        "terminal.integrated.shell.windows": "C:\\Program 		  Files\\Git\\bin\\bash.exe",
        "go.useLanguageServer": true,
        "explorer.confirmDelete": false,
        "explorer.confirmDragAndDrop": false,
        "workbench.iconTheme": "vscode-icons",
        "vsicons.dontShowNewVersionMessage": true,
        "http.proxySupport": "off",
        "go.toolsManagement.autoUpdate": true,
        "terminal.integrated.tabs.enabled": true,
        "terminal.integrated.defaultProfile.windows": "Git Bash",
        "git.autofetch": true,
        "files.autoSave": "afterDelay",
        "go.testFlags": ["-v"]
    }
    

2.5.4. 扩展: 测试用例

引入Go Modules后, 最好不要在一个文件下面放2个main.go,我们讲采用go test的方式快速演示功能,比如:

go_test_file

关键点:

  • 文件名命名要求: {pkg_name}_test.go

  • 函数命名要求: 大写Test开头

  • 函数参数: (t *testing.T)

比如 test/test_test.go

package test

import (
    "testing"
)

func TestValueRef(t *testing.T) {
    i := "this is a"
    j := &i
    *j = "this is j"
    t.Log(i, *j)
}

image-20211211012344000

2.7. 在线IDE

小技巧

随着技术的进步,你甚至可以用ipad或者其他平板来作为你主力开发工具

项目地址: openvscode-server

Screenshot 2021-09-02 at 08 39 26

  • Start the server:

docker run -it --init -p 3000:3000 -v "$(pwd):/home/workspace:cached" gitpod/openvscode-server
  • 访问终端中打印的 URL。仅转到端口 3000 是行不通的,因为 VS Code 要求您提供唯一生成的安全令牌以防止未经授权的访问。

关于安全令牌的说明

从 OpenVSCode Server v1.62 开始,您必须使用服务器生成的连接令牌访问 Web UI。如果这不是您想要的,而是想自己生成这些令牌,请启动服务器–connection-token YOUR_TOKEN以强制使用您的秘密。如果您希望您的开发环境更加安全,请使用所需的令牌作为其内容创建一个纯文本文件,并将其提供给服务器–connection-secret YOUR_SECRET_FILE。

tar -xzf openvscode-server-v ${OPENVSCODE_SERVER_VERSION} .tar.gz
 cd openvscode-server-v ${OPENVSCODE_SERVER_VERSION} 
./server.sh
  • 访问终端中打印的 URL。仅转到端口 3000 是行不通的,因为 VS Code 要求您提供唯一生成的安全令牌以防止未经授权的访问。

小技巧

为保证服务器安全,可以在vscode-server服务前面加上https代理,可以参考caddy实现自动https加密