叩町

叩町

【GO】GO开发环境准备

go
7
2025-12-15
【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 安装目录下的二进制(gogofmt)。为了能执行 Go 命令,必须在 PATH 中可见。
  • GOPATH/bin:你用 go install 安装的第三方/自写工具的可执行文件。想直接运行这些工具,通常也要把它加入 PATH

使用安装包

无论在windows、macos还是linux,均可使用官方提供的安装包自动完成安装步骤,一些默认行为如下:

项目WindowsmacOSLinux(发行版包管理器: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/removednf upgrade/removepacman -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环境变量及其作用如下:

变量常见值示例作用/含义
GOOSlinux/darwin/windows目标操作系统(交叉编译时很关键)。
GOARCHamd64/arm64目标 CPU 架构(交叉编译时很关键)。
GOVERSIONgo1.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空 / 自定义临时目录构建/测试使用的临时文件目录;为空时用系统临时目录。
GOPROXYhttps://proxy.golang.org,direct模块下载代理;可设为公司代理或direct直连。
GOSUMDBsum.golang.org依赖校验数据库(校验go.sum中的模块哈希)。
GOPRIVATE*.corp.example.com/github.com/yourorg/*标记私有模块:跳过公共代理与 sumdb(同时影响GONOSUMDB/GONOPROXY默认行为)。
GONOPROXY空 / 同GOPRIVATE模式指定哪些模块不走GOPROXY
GONOSUMDB空 / 同GOPRIVATE模式指定哪些模块不走GOSUMDB校验。
GO111MODULE空(默认)/on/off模块模式开关(新版本多为默认模块模式;一般不用设置)。
CGO_ENABLED0/1是否启用 cgo;影响能否链接 C 代码、以及交叉编译复杂度。
CCgcc/clangcgo 使用的 C 编译器(仅 cgo 相关时重要)。
CXXg++/clang++cgo 使用的 C++ 编译器。
GOFLAGS空 /-trimpath -mod=readonlygo命令的默认全局参数(会影响构建/测试/下载行为)。
GOTOOLCHAINauto/local/go1.25.5+auto选择工具链策略:是否允许自动下载/切换匹配版本工具链(取决于版本与配置)。
GOWORK/path/to/go.work""workspace 模式文件路径(多模块协作时用)。
GOMAXPROCS空 /8Go 运行时可用的最大 CPU 线程数(不设则按系统 CPU 自动)。
GODEBUG空 /http2debug=1运行时/标准库调试开关(用于排查问题)。
GOPATH/bin是否在PATH...:$HOME/go/bin:...不是go env变量,但很常见:决定你安装的 Go 工具/二进制(go install ...@latest)能否直接运行。
  • 0