Skip to content

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 GOPROXY

Ubuntu / 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

变量含义默认值
GOROOTGo 安装目录/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/hello
go
// 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