# GoLang开发环境搭建 ```{eval-rst} .. include:: ../../sumaccess.rst ``` > 在开始安装之前,大概说下不同的操作系统的具体使用场景 1. 在windows环境下,通过界面化的IDE完成代码的编写; 2. 代码提交至Git仓库,这里的仓库可能是公共服务Gitee、Github,也可能是公司或个人的私有仓库; 3. 通过流水线或手工拉取代码到Linux服务器上(或者是容器内部); 4. 在Linux环境完成代码的编译、运行。 ## Go解释器安装 ```{IMPORTANT} Go语言1.14版本之后推荐使用go modules管理依赖,也不再需要把代码写在GOPATH目录下了 ``` [Go官网下载地址](https://golang.org/dl/) [Go官方镜像站(推荐)](https://golang.google.cn/dl/) image-20211113085500041 ### 安装步骤 :::{tabbed} Windows下安装 ```{tip} 此安装实例以 64位Win10系统安装 Go1.17.3可执行文件版本为例 ``` 将上一步选好的安装包下载到本地 **双击**下载好的文件,然后按照下图的步骤安装即可。 ![image-20211113090233658](image/image-20211113090233658.png) ![image-20211113090250780](image/image-20211113090250780.png) ![image-20211113090649279](image/image-20211113090649279.png) ![image-20211113090706316](image/image-20211113090706316.png) ![image-20211113090743808](image/image-20211113090743808.png) ![image-20211113090757412](image/image-20211113090757412.png) **至此,Windows环境已经安装完成了Go解释器。** 去指定的目前下,一般会存在以下文件目录 ![image-20211117113951879](image/image-20211117113951879.png) ```{eval-rst} :api: Sgo语言的api存放目录 :bin: 存放go的二进制命令,一般包括go和gofmt :lib: go :misc: ... :pkg: 存放编译后的包文件 :src: 存放项目源文件 ``` ```{note} Windows安装完成后会自动添加GOROOT、GOPATH和Path环境变量,但是GOPATH我们很可能需要修改成自定义的 ``` - WIN+R,打开运行窗口。输入`sysdm.cpl`,回车![img](image/1722725-20190901090057848-575976811.png) - 切换到`高级`页签,点击环境变量,即可进入环境变量管理界面。 ![img](image/1722725-20190901090138514-1530104080.png) **检查** 上一步安装过程执行完毕后,`Win+R` 在弹窗输入`cmd`打开终端窗口,输入`go version`命令,查看安装的Go版本。 ​ ![image-20211113091223854](image/image-20211113091223854.png) ::: :::{tabbed} Linux下安装 > 如果不是要在Linux平台敲go代码就不需要在Linux平台安装Go,我们开发机上写好的go代码只需要跨平台编译(详见末尾的跨平台编译)好之后就可以拷贝到Linux服务器上运行了,**这也是go程序跨平台易部署的优势**。 我们在版本选择页面选择并下载好`go1.17.3.linux-amd64.tar.gz`文件: ```bash # wget https://golang.google.cn/dl/go1.17.3.linux-amd64.tar.gz ``` 将下载好的文件解压到`/usr/local`目录下: ```bash # tar -zxvf go1.17.3.linux-amd64.tar.gz -C /usr/local ``` 执行完就可以在`/usr/local/`下看到`go`目录了。 ![image-20211113092311403](image/image-20211113092311403.png) **配置环境变量** Linux下有两个文件可以配置环境变量,其中`/etc/profile`是对**所有**用户生效的;`$HOME/.profile`是对**当前**用户生效的,根据自己的情况自行选择一个文件打开,添加如下两行代码 ```bash 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 该文件,使环境变量生效 ```bash # source /etc/profile ``` ** 检查** ```shell # go version go version go1.17.3 linux/amd64 ``` ::: :::{tabbed} Mac下安装 下载可执行文件版,直接点击**下一步**安装即可,默认会将go安装到`/usr/local/go`目录下。![Mac安装Go](image/mac_install_go.png) 可以执行下面的命令修改GOPROXY: ```bash go env -w GOPROXY=https://goproxy.cn,direct ``` ::: ## 环境变量说明 ### GOROOT和GOPATH - **GOROOT** 是go解释器的安装目录,go原生的工具也在该目录下,例如`gofmt` - **GOPATH** 通常存放自己开发的代码(gomod未启用)或者一些第三方依赖库,在GOPATH目录下通常会建src、pkg和bin三个文件夹 ### Go Modules `go module`是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,`go module`将是Go语言默认的依赖管理工具。 #### GO111MODULE 要启用`go module`支持首先要设置环境变量`GO111MODULE`,通过它可以开启或关闭模块支持,它有三个可选值:`off`、`on`、`auto`,默认值是`auto`。 1. `GO111MODULE=off`禁用模块支持,编译时会从`GOPATH`和`vendor`文件夹中查找包。 2. `GO111MODULE=on`启用模块支持,编译时会忽略`GOPATH`和`vendor`文件夹,只根据 `go.mod`下载依赖。 3. `GO111MODULE=auto`,当项目在`$GOPATH/src`外且项目根目录有`go.mod`文件时,开启模块支持。 简单来说,设置`GO111MODULE=on`之后就可以使用`go module`了,以后就没有必要在GOPATH中创建项目了,并且还能够很好的管理项目依赖的第三方包信息。 使用 go module 管理依赖后会在项目根目录下生成两个文件`go.mod`和`go.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 ``` ### GOPROXY (非常重要) **下载依赖库时走哪个镜像代理站。** 默认GoPROXY配置是:`GOPROXY=https://proxy.golang.org,direct`,由于国内访问不到。 这里推荐使用`https://goproxy.io`或`https://goproxy.cn`。 #### GOPRIVATE 通常,GoLang项目会同时使用开源和私有模块。一些用户使用`GOPRIVATE`环境变量来指定一个必须绕过`GOPROXY`和`GOSUMDB`的路径列表,并直接从私有repos下载私有模块 ```{tip} “direct” 为特殊指示符,用于指示 Go 回源到模块版本的源地址去抓取(比如 GitHub 等),当值列表中上一个 Go module proxy 返回 404 或 410 错误时,Go 自动尝试列表中的下一个,遇见 “direct” 时回源 项目内使用了GOPRIVATE的依赖时,必须设置direct,否则无法拉取GOPRIVATE的包 ``` ## Go开发编辑器安装 Go采用的是`UTF-8`编码的文本文件存放源代码,理论上使用任何一款文本编辑器都可以做Go语言开发,这里推荐使用`VS Code`和`Goland`。 `VS Code`是微软开源的编辑器,而`Goland`是jetbrains出品的付费`IDE`。 我们这里使用`VS Code` 加插件做为go语言的开发工具。 ### VS Code介绍 `VS Code`全称`Visual Studio Code`,是微软公司开源的一款**免费**现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比 Diff、GIT 等特性,支持插件扩展,支持 Win、Mac 以及 Linux平台。 虽然不如某些IDE功能强大,但是它添加Go扩展插件后已经足够胜任我们日常的Go开发。 ### 下载与安装 `VS Code`官方下载地址:https://code.visualstudio.com/Download ![image-20211113094144982](image/image-20211113094144982.png) 三大主流平台都支持,请根据自己的电脑平台选择对应的安装包。 此安装实例以 `64位Win10`系统安装 `vscode-1.16.2`为例。 ![image-20211113094357545](image/image-20211113094357545.png) 双击下载好的安装文件,即可开始安装。 ![image-20211113094523811](image/image-20211113094523811.png) ![image-20211113094605362](image/image-20211113094605362.png) ![image-20211113094622323](image/image-20211113094622323.png) ![image-20211113094645049](image/image-20211113094645049.png) ![image-20211113094703962](image/image-20211113094703962.png) ![image-20211113094743493](image/image-20211113094743493.png) ### 配置 #### 安装中文简体插件 点击左侧菜单栏最后一项`管理扩展`,在`搜索框`中输入`chinese` ,选中结果列表第一项,点击`install`安装。 安装完毕后右下角会提示`重启VS Code`,重启之后你的VS Code就显示中文啦!![安装简体中文插件](image/vscode1.gif) `VSCode`主界面介绍:![vscode_menu](image/vscode_menu.png) #### 安装go扩展 现在我们要为我们的VS Code编辑器安装`Go`扩展插件,让它支持Go语言开发。 点击左侧菜单栏最后一项`管理扩展`,在`搜索框`中输入`Go` ,选中结果列表第一项,点击`install`安装。 ![image-20211113095115056](image/image-20211113095115056.png) ## 第一个Go程序 ### Hello World 现在我们来创建第一个Go项目——`hello`。在自定义位置创建一个`hello`目录,并通过VS Code打开该目录。 ![image-20211113095606549](image/image-20211113095606549.png) ![image-20211113095742092](image/image-20211113095742092.png) ![image-20211113095919311](image/image-20211113095919311.png) #### go mod init 使用go module模式新建项目时,我们需要通过`go mod init 项目名`命令对项目进行初始化,该命令会在项目根目录下生成`go.mod`文件。例如,我们使用`hello`作为我们第一个Go项目的名称,执行如下命令。 ```bash go mod init hello ``` ![image-20211113100220440](image/image-20211113100220440.png) #### 编写代码 接下来在该目录中创建一个`main.go`文件: ```go package main // 声明 main 包,表明当前是一个可执行程序 import "fmt" // 导入内置 fmt 包 func main(){ // main函数,是程序执行的入口 fmt.Println("Hello World!") // 在终端打印 Hello World! } ``` ```{IMPORTANT} 如果此时VS Code右下角弹出提示让你安装插件,务必点 **install all** 进行安装 ``` ### 编译 `go build`命令表示将源代码编译成可执行文件。 在hello目录下执行: ```bash go build ``` 或者在其他目录执行以下命令: ```bash go build hello ``` ![image-20211113101622029](image/image-20211113101622029.png) go编译器会去 `GOPATH`的src目录下查找你要编译的`hello`项目 编译得到的可执行文件会保存在执行编译命令的当前目录下,如果是windows平台会在当前目录下找到`hello.exe`可执行文件。 可在终端直接执行该`hello.exe`文件: ```bash PS E:\GoPro\Code\hello> ./hello.exehello world! ``` 我们还可以使用`-o`参数来指定编译后得到的可执行文件的名字。 ```bash go build -o heiheihei.exe ``` ### Windows下VSCode切换cmd.exe作为默认终端 如果你打开VS Code的终端界面出现如下图场景(注意观察红框圈中部分),那么你的`VS Code`此时正使用`powershell`作为默认终端: ![image-20211113103214116](image/image-20211113103214116.png) 十分推荐你按照下面的步骤,选择`cmd.exe`作为默认的终端工具: ![image-20211113103345946](image/image-20211113103345946.png) 如果没有出现下拉三角,也没有关系,按下`Ctrl+Shift+P`,VS Code正上方会出现一个框,你按照下图输入`shell`,然后点击指定选项即可出现上面的界面了。 ### go run `go run main.go`也可以执行程序,该命令本质上也是**先编译再执行**。 ### go install `go install`表示安装的意思,它先编译源代码得到可执行文件,然后将可执行文件移动到`GOPATH`的`bin`目录下。因为我们的环境变量中配置了`GOPATH`下的`bin`目录,所以我们就可以在任意地方直接执行可执行文件了。 ### 跨平台编译 默认我们`go build`的可执行文件都是当前操作系统可执行的文件,Go语言支持跨平台编译--在当前平台(例如Windows)下编译其他平台(例如Linux)的可执行文件。 #### Windows编译Linux可执行文件 如果我想在Windows下编译一个Linux下可执行文件,那需要怎么做呢?只需要在编译时指定目标操作系统的平台和处理器架构即可。 > 注意:无论你在Windows电脑上使用VsCode编辑器还是Goland编辑器,都要注意你使用的终端类型,因为不同的终端下命令不一样!!!目前的Windows通常默认使用的是`PowerShell`终端。 如果你的`Windows`使用的是`cmd`,那么按如下方式指定环境变量。 ```bash SET CGO_ENABLED=0 // 禁用CGOSET GOOS=linux // 目标平台是linuxSET GOARCH=amd64 // 目标处理器架构是amd64 ``` > 注意,输入的时候不能在后面有空格,否则会出现cmd/go: unsupported GOOS/GOARCH pair linux/amd64 报错 如果你的`Windows`使用的是`PowerShell`终端,那么设置环境变量的语法为 ```bash $ENV:CGO_ENABLED=0$ENV:GOOS="linux"$ENV:GOARCH="amd64" ``` 在你的`Windows`终端下执行完上述命令后,再执行下面的命令,得到的就是能够在Linux平台运行的可执行文件了。 ```bash go build ``` #### Windows编译Mac可执行文件 Windows下编译Mac平台64位可执行程序: cmd终端下执行: ```bash SET CGO_ENABLED=0SET GOOS=darwinSET GOARCH=amd64go build ``` PowerShell终端下执行: ```bash $ENV:CGO_ENABLED=0$ENV:GOOS="darwin"$ENV:GOARCH="amd64"go build ``` #### Mac编译Linux可执行文件 Mac电脑编译得到Linux平台64位可执行程序: ```bash CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build ``` #### Mac编译Windows可执行文件 Mac电脑编译得到Windows平台64位可执行程序: ```bash CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build ``` #### Linux编译Mac可执行文件 Linux平台下编译Mac平台64位可执行程序: ```bash CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build ``` #### Linux编译Windows可执行文件 Linux平台下编译Windows平台64位可执行程序: ```bash CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build ``` 现在,开启你的Go语言学习之旅吧。人生苦短,我用GoLang~ ## 如何创建一个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}文件夹, 然后你就可以在该工程下面 写程序了 ### go.mod go.mod文件记录了项目所有的依赖信息,其结构大致如下: ```sh 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`表示间接引用 ### 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 解释为什么需要依赖 ``` ### 设置你的工作目录 该课件里面包含课程演示过程中的所有代码, 都放置于根目录: ``` 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](https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2Fgolang%2Ftools%2Fblob%2Fmaster%2Fgopls%2Fdoc%2Fworkspace.md) 注意: vscode一次只能打开一个工程, 所以你vscode需要打的目录是: {your_gomod_workspace}/xxx) 3.运行代码示例 运行示例: ![vscode_go_test_run](image/vscode_go_test_run.png) 由于直接运行时,不会打印`fmt.Print`的信息, 我们需要如下配置vscode 才可以 4.配置vscode打印run test详情内容 - 首先安装gotest ```go 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](image/image-20211211011512017.png) - 通过修改 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"] } ``` ### 扩展: 测试用例 引入Go Modules后, 最好不要在一个文件下面放2个main.go,我们讲采用go test的方式快速演示功能,比如: ![go_test_file](image/go_test_file.png) 关键点: - 文件名命名要求: {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](image/image-20211211012344000.png) ## Golang的在线编辑器 - https://go.dev/play/ - https://play.studygolang.com/ - https://goplay.space/ - https://goplay.tools/ - https://gitpod.io ## 在线IDE ```{TIP} 随着技术的进步,你甚至可以用ipad或者其他平板来作为你主力开发工具 ``` 项目地址: [openvscode-server](https://github.com/gitpod-io/openvscode-server) ![Screenshot 2021-09-02 at 08 39 26](image/131794918-d6602646-4d67-435b-88fe-620a3cc0a3aa.png) :::{tabbed} Docker安装 - Start the server: ``` docker run -it --init -p 3000:3000 -v "$(pwd):/home/workspace:cached" gitpod/openvscode-server ``` - 访问终端中打印的 URL。仅转到端口 3000 是行不通的,因为 VS Code 要求您提供唯一生成的安全令牌以防止未经授权的访问。 ```{admonition} 关于安全令牌的说明 从 OpenVSCode Server v1.62 开始,您必须使用服务器生成的连接令牌访问 Web UI。如果这不是您想要的,而是想自己生成这些令牌,请启动服务器--connection-token YOUR_TOKEN以强制使用您的秘密。如果您希望您的开发环境更加安全,请使用所需的令牌作为其内容创建一个纯文本文件,并将其提供给服务器--connection-secret YOUR_SECRET_FILE。 ``` ::: :::{tabbed} Linux安装 - [下载最新版本](https://github.com/gitpod-io/openvscode-server/releases/latest) - 解压并运行服务器: ``` tar -xzf openvscode-server-v ${OPENVSCODE_SERVER_VERSION} .tar.gz cd openvscode-server-v ${OPENVSCODE_SERVER_VERSION} ./server.sh ``` - 访问终端中打印的 URL。仅转到端口 3000 是行不通的,因为 VS Code 要求您提供唯一生成的安全令牌以防止未经授权的访问。 ::: ```{tip} 为保证服务器安全,可以在vscode-server服务前面加上https代理,可以参考[caddy](https://caddyserver.com/)实现自动https加密 ``` ```{eval-rst} .. include:: ../../comment.rst ```