go 语言开发环境搭建

如果你是2022年开始学go的,恭喜,基本不需要任何配置,安装go语言后就可以开箱即用go语言开发环境。

以下基于Windows + VSCode搭建go语言开发环境。

下载安装go语言

官方下载地址: https://go.dev

安装说明如下: https://go.dev/doc/install

如果是Windows系统, 直接下载msi 的安装包安装,会自动设置环境变量。

测试安装

PS C:\Users\lenovo> go version
go version go1.18.4 windows/amd64

查看帮助

PS C:\Users\lenovo> go help
Go is a tool for managing Go source code.

Usage:

        go <command> [arguments]

The commands are:

        bug         start a bug report
        build       compile packages and dependencies
        clean       remove object files and cached files
        doc         show documentation for package or symbol
        env         print Go environment information
        fix         update packages to use new APIs
        fmt         gofmt (reformat) package sources
        generate    generate Go files by processing source
        get         add dependencies to current module and install them
        install     compile and install packages and dependencies
        list        list packages or modules
        mod         module maintenance
        work        workspace maintenance
        run         compile and run Go program
        test        test packages
        tool        run specified go tool
        version     print Go version
        vet         report likely mistakes in packages

Use "go help <command>" for more information about a command.

Additional help topics:

        buildconstraint build constraints
        buildmode       build modes
        c               calling between Go and C
        cache           build and test caching
        environment     environment variables
        filetype        file types
        go.mod          the go.mod file
        gopath          GOPATH environment variable
        gopath-get      legacy GOPATH go get
        goproxy         module proxy protocol
        importpath      import path syntax
        modules         modules, module versions, and more
        module-get      module-aware go get
        module-auth     module authentication using go.sum
        packages        package lists and patterns
        private         configuration for downloading non-public code
        testflag        testing flags
        testfunc        testing functions
        vcs             controlling version control with GOVCS

Use "go help <topic>" for more information about that topic.

具体命令见后续。

go env

查看go语言环境变量等信息

PS C:\Users\lenovo> go env
set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\lenovo\AppData\Local\go-build
set GOENV=C:\Users\lenovo\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=C:\Users\lenovo\go\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\lenovo\go
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=C:\Program Files\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=C:\Program Files\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.18.4
set GCCGO=gccgo
set GOAMD64=v1
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=NUL
set GOWORK=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\lenovo\AppData\Local\Temp\go-build3893195504=/tmp/go-build -gno-record-gcc-switches

其中几个重要的变量含义如下:

GOROOT

GOROOT就是Go的安装目录

GOPATH

GOPATH是我们的工作空间,保存go项目代码和第三方依赖包。

GOPATH可以设置多个,其中,第一个将会是默认的包目录。

使用 go get 下载的包都会在第一个path中的src目录下

使用 go install时,在哪个GOPATH中找到了这个包,就会在哪个GOPATH下的bin目录生成可执行文件

GO111MODULE

一开始go发布的时候是没有包管理的,也没有版本的概念,master 就代表稳定的版本。

go get命令会根据路径,把相应的模块获取并保存在 $GOPATH/src

::: tip

Go 1.11 引入了 Go 模块。

就有了GO111MODULE 这个环境变量,可以在使用 Go 或者更改 Go 导入包的方式时候设置。

:::

Go Modules 不使用 GOPATH 存储每个软件包的单个 git checkout,而是存储带有 go.mod 标记版本的标记版本,并跟踪每个软件包的版本。

⚡️ 有三个取值:

  • on: 即使项目在GOPATH 中,GO111MODULE = on 仍将强制使用 Go 模块 ,需要 go.mod 才能正常工作。
  • off:强制 Go 表现出 GOPATH 方式,即使你的项目不在 GOPATH 目录里(不推荐)。
  • auto: Go 1.13开始是默认模式。

对于默认模式,当存在 go.mod 文件时或处于 GOPATH 外, 其行为均会等同于 GO111MODULE=on。当项目目录处于 GOPATH 内,且没有 go.mod 文件存在时其行为会等同于 GO111MODULE=off。

在Go 1.16中,GO111MODULE默认是开启状态。

一个module就是一组包的集合,即go.mod文件所在目录下定义的所有的包都属于这个模块。

go.mod文件定义了模块的路径path,这个路径是用于import的路径以及编译时该模块依赖于其他模块的需求。

该模块依赖的模块通过模块路径 + 语义化的版本号的格式添加到go.mod中。

::: danger

后续所有的学习都是基于 go.mod

:::

GOMODCACHE

模块缓存。

模块缓存是 go 命令存储下载模块文件的目录。

默认模块位置是 $GOPATH/pkg/mod

使用 Go Modules 时,在 go build 期间使用的包存储在 $GOPATH/pkg/mod 中。

GOPROXY

从Go 1.13开始,Go Module作为Golang中的标准包管理器,在安装时自动启用,并附带一个默认的GOPROXY。

GOPROXY控制Go Module下载的来源,有助于确保构建的确定性和安全性。

GOPROXY默认为 https://proxy.golang.org,direct

由于网络的原因,可能导致下载比较慢,我们可以配置为goproxy.io。

网址:GOPROXY.IO - 一个全球代理 为 Go 模块而生

# ----------------- Bash (Linux or macOS)
# 配置 GOPROXY 环境变量
export GOPROXY=https://proxy.golang.com.cn,direct
# 还可以设置不走 proxy 的私有仓库或组,多个用逗号相隔(可选)
export GOPRIVATE=git.mycompany.com,github.com/my/private

# ----------------- PowerShell (Windows)
# 配置 GOPROXY 环境变量, 官网文档首页有错误
$env:GOPROXY = "https://proxy.golang.com.cn,direct"
# 还可以设置不走 proxy 的私有仓库或组,多个用逗号相隔(可选)
$env:GOPRIVATE=git.mycompany.com,github.com/my/private

# ------------- 如果需要长期有效,可以如下操作,Windows为例:
1. 右键 我的电脑 -> 属性 -> 高级系统设置 -> 环境变量
2. 在 “[你的用户名]的用户变量” 中点击 ”新建“ 按钮
3. 在 “变量名” 输入框并新增 “GOPROXY”
4. 在对应的 “变量值” 输入框中新增 “https://proxy.golang.com.cn,direct”
5. 最后点击 “确定” 按钮保存设置

常用命令

go get

该命令可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包。

go get -u "github.com/VictoriaMetrics/fastcache"

go build

该命令用于编译我们指定的源码文件或代码包以及它们的依赖包。

go install

该命令用于编译并安装指定的代码包及它们的依赖包。

go install命令只比go build命令多做了一件事,即:安装编译后的结果文件到指定目录。

go run

该命令可以运行命令源码文件,只能接受一个命令源码文件以及若干个库源码文件(必须同属于 main包)作为文件参数,且不能接受测试源码文件。

go clean

该命令会删除掉执行其它命令时产生的一些文件和目录。

go list

该命令的作用是列出指定的代码包的信息。

go mod init

该命令初始化并写入一个新的go.mod至当前目录中,实际上是创建一个以当前目录为根的新模块。文件go.mod必须不存在。

go mod init demo

::: tip

完整命令可以参考官方文档或:Golang常用工具分享 - 腾讯云开发者社区-腾讯云 (tencent.com)

:::

Vscode 安装go扩展

安装以下扩展即可。

Hello world

mkdir helloworld
cd helloworld
> go mod init helloworld
go: creating new go.mod: module helloworld

通过以上命令,即初始化了一个hello world 项目。

接下来,我们就可以创建第一个go程序了。

go语言程序的扩展名为 .go ,我们创建一个 hello.go ,输入以下内容:

package main

import "fmt"

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

在终端,运行以下命令:

> go run .\hello.go
Hello, World!

恭喜!现在开始go语言的学习吧。