【GO】GO开发环境准备
编辑
【GO】GO开发环境准备
版本选择
Go语言官方的版本发布节奏已经基本稳定,通常每半年发布一次(大致2月和8月),版本号使用语义化版本号对版本进行描述:
1.X:主线版本,通常每半年发布一次。1.X.Y:补丁版本,用于修复bug或安全问题,不会引入新特性。
Go官方对Go1.X有兼容性承诺,语言层面与标准库的公共API尽量保持兼容,意味着大部分项目可以做到平滑升级,但也存在以下允许变化的范围:
- 修复BUG:可能导致少量边缘行为变化。
- 工具链/诊断信息变化。
- 标准库内部实现方式变化,但对外API会保持兼容。
Go通常会维护两个主线版本的补丁更新,因此有以下几种版本选择策略:
- 紧跟Go开发团队的步伐,总是升级到最新版本(Kubernetes)
- 继续使用两个发布周期之前的版本(Docker)
- 使用上一个主线版本的最新补丁版本。
对于初学者来说,使用最新版本是比较推荐的,这样可以体验到最新的语言特性、标准库API以及工具链。
安装
go语言官方下载地址:go.dev/dl/
页面列出了当前最新的两个主线版本的SDK文件,包含源码、预编译二进制和可执行安装包,无论哪一种方式,最终目的都是将go的目录放在一个可控易维护的目录下,并让系统可以在PATH中可以找到go,从而在任意目录可以直接执行Go相关命令。也就是说把GOROOT/bin加入PATH。
此外,
还要区分两类“bin”:
GOROOT/bin:Go 安装目录下的二进制(go、gofmt)。为了能执行 Go 命令,必须在PATH中可见。GOPATH/bin:你用go install安装的第三方/自写工具的可执行文件。想直接运行这些工具,通常也要把它加入PATH。
使用安装包
无论在windows、macos还是linux,均可使用官方提供的安装包自动完成安装步骤,一些默认行为如下:
| 项目 | Windows | macOS | Linux(发行版包管理器:apt/dnf/yum/pacman 等) |
|---|---|---|---|
| 官方安装包形式 | .msi | .pkg | 发行版仓库包(如apt install golang/dnf install golang等) |
| 默认安装位置(GOROOT) | C:\Program Files\Go | /usr/local/go | 依发行版而定(由打包规则决定,路径不统一) |
是否自动让go可直接执行(PATH 处理) | 通常会自动把...\Go\bin加到系统PATH | 是否自动改 shell 的PATH不一定;常见需用户自行确保PATH含/usr/local/go/bin | 通常会配置好使go直接可执行(PATH 已可找到),但细节依发行版而异 |
是否默认设置GOROOT环境变量 | 通常不需要/不强制设置 | 通常不需要/不强制设置 | 通常不需要/不强制设置 |
是否默认设置GOPATH环境变量 | 通常不设置 | 通常不设置 | 通常不设置 |
未设置GOPATH时的默认值 | C:\Users\<用户名>\go | $HOME/go | $HOME/go |
| 升级/卸载的典型默认行为 | 系统“应用和功能”卸载;升级常覆盖安装 | 升级常覆盖/usr/local/go;卸载多为删除目录 | 用包管理器升级/卸载(如apt upgrade/remove、dnf upgrade/remove、pacman -Syu/-R);版本受发行版仓库影响(可能滞后) |
使用预编译二进制
windows
windows下可将下载的zip格式安装包解压至固定目录,以C:\go\为例,解压完成后,按下WIN+R打开运行对话框,输入SystemPropertiesComputerName.exe打开系统信息对话框(也可以通过设置中的高级系统设置手动打开),点击右下角的环境变量按钮,在系统变量中新增两个变量:
GOROOT:"C:\go"GOPATH:"C:\gopath"
之后在PATH变量中新增%GOROOT%\bin和%GOPATH%\bin两项,添加完成后保存,此时可在cmd中输入go version命令查看go版本,如果正确输出对应的版本信息,说明配置成功。
MacOS和Linux
对于MacOS和Linux,可以参考以下脚本的步骤进行下载和安装:
MacOS:
#!/usr/bin/env bash
set -Eeuo pipefail
log(){ printf '[%s] %s\n' "$(date '+%F %T')" "$*"; }
die(){ log "ERROR: $*"; exit 1; }
trap 'rc=$?; log "ERROR: failed (exit=$rc) at line $LINENO: $BASH_COMMAND"; exit $rc' ERR
CURL_COMMON=(
-4
-fSL
--connect-timeout 5
--max-time 20
--retry 3
--retry-delay 1
--retry-connrefused
)
log "Step 0/8: Detect architecture..."
arch="$(uname -m)"
case "$arch" in
arm64) goarch="arm64" ;;
x86_64) goarch="amd64" ;;
*) die "Unsupported arch: $arch" ;;
esac
log " arch=$arch -> goarch=$goarch"
log "Step 1/8: Fetch latest Go version (IPv4 only)..."
log " curl opts: ${CURL_COMMON[*]}"
ver="$(curl "${CURL_COMMON[@]}" https://go.dev/VERSION?m=text | head -n 1 | tr -d '\r\n')"log " ver=$ver"
log "Step 2/8: Build download URL..."
tgz="${ver}.darwin-${goarch}.tar.gz"
url="https://go.dev/dl/${tgz}"
dst="/tmp/${tgz}"
log " url=$url"
log " dst=$dst"
log "Step 3/8: Download tarball (IPv4 only)..."
curl "${CURL_COMMON[@]}" "$url" -o "$dst"
log " downloaded: $(ls -lh "$dst" | awk '{print $5, $9}')"
log "Step 4/8: Install to /usr/local/go (requires sudo)..."
log " removing old /usr/local/go (if any)"
sudo rm -rf /usr/local/go
log " extracting..."
sudo tar -C /usr/local -xzf "$dst"
log " installed: $(/usr/local/go/bin/go version 2>/dev/null || true)"
log "Step 5/8: Ensure GOPATH bin exists..."
mkdir -p "$HOME/go/bin"
log " ensured: $HOME/go/bin"
log "Step 6/8: Append env to ~/.zshrc (may duplicate if rerun)..."
{
echo ''
echo '# Go'
echo 'export GOROOT="/usr/local/go"'
echo 'export GOPATH="$HOME/go"'
echo 'export PATH="$GOROOT/bin:$GOPATH/bin:$PATH"'
} >> "$HOME/.zshrc"
log " appended to: $HOME/.zshrc"
log "Step 7/8: Source ~/.zshrc for current shell..."
# shellcheck disable=SC1090
source "$HOME/.zshrc"
log " GOROOT=$GOROOT"
log " GOPATH=$GOPATH"
log "Step 8/8: Verify..."
log " which go: $(command -v go || true)"
go version
go env GOROOT GOPATH
log "Done."
Linux:
#!/usr/bin/env bash
set -Eeuo pipefail
log(){ printf '[%s] %s\n' "$(date '+%F %T')" "$*"; }
die(){ log "ERROR: $*"; exit 1; }
trap 'rc=$?; log "ERROR: failed (exit=$rc) at line $LINENO: $BASH_COMMAND"; exit $rc' ERR
CURL_COMMON=(
-4
-fSL
--connect-timeout 5
--max-time 20
--retry 3
--retry-delay 1
--retry-connrefused
)
log "Step 0/8: Detect architecture..."
arch="$(uname -m)"
case "$arch" in
x86_64) goarch="amd64" ;;
aarch64|arm64) goarch="arm64" ;;
*) die "Unsupported arch: $arch" ;;
esac
log " arch=$arch -> goarch=$goarch"
log "Step 1/8: Fetch latest Go version (IPv4 only)..."
log " curl opts: ${CURL_COMMON[*]}"
ver="$(curl "${CURL_COMMON[@]}" https://go.dev/VERSION?m=text | head -n 1 | tr -d '\r\n')"
[[ "$ver" =~ ^go[0-9]+(\.[0-9]+){1,2}$ ]] || die "Unexpected VERSION response first line: '$ver'"
log " ver=$ver"
log "Step 2/8: Build download URL..."
tgz="${ver}.linux-${goarch}.tar.gz"
url="https://go.dev/dl/${tgz}"
dst="/tmp/${tgz}"
log " url=$url"
log " dst=$dst"
log "Step 3/8: Download tarball (IPv4 only)..."
curl "${CURL_COMMON[@]}" "$url" -o "$dst"
log " downloaded: $(ls -lh "$dst" | awk '{print $5, $9}')"
log "Step 4/8: Install to /usr/local/go (requires sudo)..."
log " removing old /usr/local/go (if any)"
sudo rm -rf /usr/local/go
log " extracting..."
sudo tar -C /usr/local -xzf "$dst"
log " installed: $(/usr/local/go/bin/go version 2>/dev/null || true)"
log "Step 5/8: Ensure GOPATH bin exists..."
mkdir -p "$HOME/go/bin"
log " ensured: $HOME/go/bin"
log "Step 6/8: Append env to ~/.bashrc (may duplicate if rerun)..."
{
echo ''
echo '# Go'
echo 'export GOROOT="/usr/local/go"'
echo 'export GOPATH="$HOME/go"'
echo 'export PATH="$GOROOT/bin:$GOPATH/bin:$PATH"'
} >> "$HOME/.bashrc"
log " appended to: $HOME/.bashrc"
log "Step 7/8: Source ~/.bashrc for current shell..."
# shellcheck disable=SC1090
source "$HOME/.bashrc"
log " GOROOT=$GOROOT"
log " GOPATH=$GOPATH"
log "Step 8/8: Verify..."
log " which go: $(command -v go || true)"
go version
go env GOROOT GOPATH
log "Done."
配置
可以通过go env命令查看当前环境下的go的配置信息,常见的Go环境变量及其作用如下:
| 变量 | 常见值示例 | 作用/含义 |
|---|---|---|
GOOS | linux/darwin/windows | 目标操作系统(交叉编译时很关键)。 |
GOARCH | amd64/arm64 | 目标 CPU 架构(交叉编译时很关键)。 |
GOVERSION | go1.25.5 | 当前 Go 工具链版本。 |
GOROOT | /usr/local/go(Linux/mac 常见)/C:\Go(Windows 常见) | Go 安装目录(包含标准库源码、编译器、go命令等)。一般不需要手动改。 |
GOPATH | $HOME/go | 工作区根目录:默认包含src/(旧模式)、pkg/、bin/;go install的可执行文件常装到$GOPATH/bin。 |
GOBIN | 空(默认)/$HOME/go/bin/ 自定义目录 | go install输出可执行文件的目录;为空时默认是$GOPATH/bin。 |
GOMOD | /path/to/project/go.mod或"" | 当前模块的go.mod路径;若不在模块内通常为空。 |
GOMODCACHE | $GOPATH/pkg/mod | 模块下载后的本地缓存目录(只读缓存区)。 |
GOCACHE | $HOME/.cache/go-build(Linux 常见)/$HOME/Library/Caches/go-build(mac 常见) | 构建缓存目录,用于加速编译(可安全清理,会自动重建)。 |
GOTMPDIR | 空 / 自定义临时目录 | 构建/测试使用的临时文件目录;为空时用系统临时目录。 |
GOPROXY | https://proxy.golang.org,direct | 模块下载代理;可设为公司代理或direct直连。 |
GOSUMDB | sum.golang.org | 依赖校验数据库(校验go.sum中的模块哈希)。 |
GOPRIVATE | *.corp.example.com/github.com/yourorg/* | 标记私有模块:跳过公共代理与 sumdb(同时影响GONOSUMDB/GONOPROXY默认行为)。 |
GONOPROXY | 空 / 同GOPRIVATE模式 | 指定哪些模块不走GOPROXY。 |
GONOSUMDB | 空 / 同GOPRIVATE模式 | 指定哪些模块不走GOSUMDB校验。 |
GO111MODULE | 空(默认)/on/off | 模块模式开关(新版本多为默认模块模式;一般不用设置)。 |
CGO_ENABLED | 0/1 | 是否启用 cgo;影响能否链接 C 代码、以及交叉编译复杂度。 |
CC | gcc/clang | cgo 使用的 C 编译器(仅 cgo 相关时重要)。 |
CXX | g++/clang++ | cgo 使用的 C++ 编译器。 |
GOFLAGS | 空 /-trimpath -mod=readonly等 | go命令的默认全局参数(会影响构建/测试/下载行为)。 |
GOTOOLCHAIN | auto/local/go1.25.5+auto等 | 选择工具链策略:是否允许自动下载/切换匹配版本工具链(取决于版本与配置)。 |
GOWORK | /path/to/go.work或"" | workspace 模式文件路径(多模块协作时用)。 |
GOMAXPROCS | 空 /8等 | Go 运行时可用的最大 CPU 线程数(不设则按系统 CPU 自动)。 |
GODEBUG | 空 /http2debug=1等 | 运行时/标准库调试开关(用于排查问题)。 |
GOPATH/bin是否在PATH | ...:$HOME/go/bin:... | 不是go env变量,但很常见:决定你安装的 Go 工具/二进制(go install ...@latest)能否直接运行。 |
- 0
-
分享