Appearance
01|Go 环境与第一个程序
运维工作里经常要写一些脚本:批量检查服务状态、定时清理日志、对接告警接口。Python 和 Shell 都能做这些事,但当脚本变成长时间运行的程序、需要并发处理大量目标、或者要交付给同事在没有 Python 环境的机器上运行时,问题开始出现。Python 脚本需要目标机器上有对应版本的解释器和依赖包;Shell 脚本在 Windows 上跑不起来,逻辑复杂后也难以维护。Go 编译成单个二进制文件,目标机器不需要装解释器就能跑。标准库自带 HTTP、JSON、并发能力,很多运维工具不需要额外依赖。
一、安装 Go
安装前先确认环境:
bash
go version
which go如果返回命令未找到,按系统选择安装方式。
Rocky / RHEL / CentOS:
bash
dnf install -y golang
go version
go env GOPATH GOROOT GOPROXYUbuntu / Debian:
bash
apt-get update
apt-get install -y golang-go
go version
go env GOPATH GOROOT GOPROXY系统仓库的 Go 版本可能偏旧。需要固定新版本时,用官方二进制包安装到 /usr/local/go:
bash
rm -rf /usr/local/go
curl -L https://go.dev/dl/go1.23.4.linux-amd64.tar.gz | tar -C /usr/local -xzf -
export PATH=$PATH:/usr/local/go/bin
go version把 export PATH=$PATH:/usr/local/go/bin 写进 ~/.bashrc,避免每次手动设置。
二、GOPATH 和 GOROOT
| 变量 | 含义 | 默认值 |
|---|---|---|
GOROOT | Go 安装目录 | /usr/local/go |
GOPATH | 工作区和依赖缓存目录 | ~/go |
GOPROXY | 模块代理地址 | https://proxy.golang.org |
国内网络访问官方代理慢,换成国内镜像:
bash
go env -w GOPROXY=https://goproxy.cn,direct三、第一个程序
创建项目目录:
bash
mkdir -p ~/go/src/hello
cd ~/go/src/hellogo
// main.go
package main
import "fmt"
func main() {
fmt.Println("hello, go")
}| 元素 | 作用 |
|---|---|
package main | 声明这是可执行程序的入口包 |
import "fmt" | 导入格式化输出包 |
func main() | 程序入口函数,必须叫 main |
编译和运行:
bash
go run main.go # 编译并立即运行,不产生二进制文件
go build main.go # 编译成当前目录的可执行文件
./main # 运行编译好的二进制go run 适合开发调试,go build 适合生成交付物。编译后的二进制不依赖 Go 环境,拷贝到任何同架构机器都能直接执行。
四、模块初始化
Go 1.11 之后推荐用模块(module)管理依赖,不再依赖 GOPATH 目录结构:
bash
mkdir ops-checker
cd ops-checker
go mod init ops-checker生成 go.mod 文件:
module ops-checker
go 1.23模块名通常是代码仓库地址或项目名。后续导入本地包时,用模块名作为前缀。
五、常用命令
| 命令 | 作用 |
|---|---|
go run | 编译并运行 |
go build | 编译成可执行文件 |
go test | 运行测试 |
go fmt | 格式化代码 |
go vet | 静态检查 |
go mod tidy | 整理依赖,添加缺失的、删除未使用的 |
go get | 下载依赖包 |
六、常见错误
没有 package main
go
// 错误:不是 main 包,编译后没有入口
package hello
func main() {
fmt.Println("hello")
}
// 正确
package main可执行程序必须是 package main,库代码才用其他包名。
GOPATH 模式下目录放错
Go 1.11 之前,代码必须放在 GOPATH/src/ 下。用模块模式后没有这个限制,但老教程可能还讲 GOPATH 模式。新项目统一用 go mod init。
国内下载依赖超时
bash
# 错误:默认代理访问慢,go get 超时
# 正确:设置国内代理
go env -w GOPROXY=https://goproxy.cn,direct