写在前面
这是 Go 学习笔记系列的第一篇,目标是从零搭建 Go 开发环境,理解项目结构和常用工具链。读完本文你将能够独立创建、编译、运行一个 Go 项目。
本系列适合有其他语言编程经验、刚开始学 Go 的开发者。
一、安装 Go
1.1 下载安装
到 Go 官方网站下载对应系统的安装包:
- 官网:https://go.dev/dl/
- 国内镜像:https://golang.google.cn/dl/
1
2
3
4
5
6
7
|
# 安装后验证
go version
# go version go1.24.x linux/amd64
# 查看 Go 安装路径
go env GOROOT
# /usr/local/go
|
1.2 环境变量
Go 安装后会自动配置,一般不需要手动设置。了解即可:
1
2
3
|
GOROOT — Go 的安装目录(类似 JAVA_HOME)
GOPATH — Go 的工作空间目录(旧版本项目放这里,go mod 之后不太重要了)
GOBIN — go install 安装的可执行文件存放路径(默认 $GOPATH/bin)
|
1
2
3
4
5
|
# 查看所有环境变量
go env
# 设置 Go 代理(国内加速模块下载)
go env -w GOPROXY=https://goproxy.cn,direct
|
1.3 开发工具
推荐使用 VS Code + Go 扩展,或 GoLand(JetBrains 出品)。
VS Code 安装 Go 扩展后会自动提示安装相关工具(gopls、dlv 等),全部安装即可。
二、第一个 Go 程序
2.1 创建项目
1
2
3
4
5
6
7
8
|
# 创建项目目录
mkdir hello && cd hello
# 初始化 Go 模块(类似 npm init)
go mod init example.com/hello
# 会生成 go.mod 文件,内容:
# module example.com/hello
# go 1.24
|
2.2 编写代码
创建 main.go:
1
2
3
4
5
6
7
|
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
}
|
2.3 运行
1
2
3
4
5
6
7
8
9
10
|
# 直接运行(不生成可执行文件)
go run main.go
# Hello, Go!
# 编译生成可执行文件
go build -o hello main.go
# 运行编译后的文件
./hello
# Hello, Go!
|
三、代码结构解析
3.1 package 声明
1
2
3
4
5
6
7
|
// 每个 Go 文件必须以 package 声明开头
// main 包是特殊的,定义了可执行程序的入口
package main
// 其他包名通常和目录名一致
package utils // 放在 utils/ 目录下
package models // 放在 models/ 目录下
|
3.2 import 导入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
// 单个导入
import "fmt"
// 多个导入(推荐写法)
import (
"fmt"
"os"
"strings"
)
// 导入但不直接使用(只执行 init 函数)
import _ "github.com/lib/pq"
// 给包起别名
import (
f "fmt"
)
// 使用别名调用
f.Println("hello")
|
注意:Go 要求导入的包必须使用,未使用的导入会编译报错。
3.3 main 函数
1
2
3
4
5
|
// main 包中的 main 函数是程序入口
// 没有 main 函数无法编译成可执行文件
func main() {
// 程序从这里开始执行
}
|
3.4 语句规则
1
2
3
4
5
6
7
8
9
10
11
12
|
// 不需要分号(编译器自动添加)
fmt.Println("hello")
// 左花括号不能换行(编译错误)
// 错误写法:
// func main()
// {
// }
// 正确写法:
func main() {
}
|
四、go mod 包管理
Go 从 1.11 开始使用 Go Modules 管理依赖,类似 npm、pip。
4.1 常用命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 初始化模块
go mod init example.com/myproject
# 添加依赖(import 后执行,自动下载)
go mod tidy
# 下载依赖到本地缓存
go mod download
# 查看依赖列表
go list -m all
# 查看某个依赖的可用版本
go list -m -versions github.com/gin-gonic/gin
|
4.2 go.mod 文件
1
2
3
4
5
6
|
module example.com/myproject // 模块名
go 1.24 // Go 版本
require (
github.com/gin-gonic/gin v1.10.0 // 直接依赖
)
|
4.3 安装第三方包
1
2
3
4
5
6
7
8
9
10
11
|
# 安装指定包(会加到 go.mod)
go get github.com/gin-gonic/gin@latest
# 安装指定版本
go get github.com/gin-gonic/gin@v1.10.0
# 清理未使用的依赖
go mod tidy
# 把依赖复制到项目的 vendor 目录
go mod vendor
|
4.4 项目结构示例
1
2
3
4
5
6
7
8
9
10
11
12
13
|
myproject/
├── go.mod // 模块定义和依赖
├── go.sum // 依赖的校验和(自动生成,不要手动改)
├── main.go // 程序入口
├── internal/ // 私有代码(其他模块不能导入)
│ └── handler/
│ └── user.go
├── pkg/ // 可被外部导入的包
│ └── utils/
│ └── string.go
└── cmd/ // 多个可执行程序
└── server/
└── main.go
|
五、工具链
5.1 常用命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# 运行
go run main.go
# 编译
go build # 编译当前包
go build -o app . # 指定输出文件名
go build ./... # 编译当前目录下所有包
# 测试
go test # 运行当前包的测试
go test ./... # 运行所有测试
go test -v ./... # 详细输出
go test -run TestName # 运行指定测试函数
# 格式化代码
go fmt ./... # 格式化所有文件
gofmt -w . # 另一种写法(-w 直接修改文件)
# 静态检查
go vet ./... # 发现常见错误
# 安装可执行工具
go install github.com/go-delve/delve/cmd/dlv@latest
|
5.2 go run vs go build
1
2
|
go run — 编译并立即运行,适合开发调试
go build — 编译生成可执行文件,适合部署分发
|
5.3 交叉编译
Go 支持交叉编译,在任意平台编译其他平台的可执行文件:
1
2
3
4
5
6
7
8
9
10
11
|
# 编译 Linux 可执行文件(在 Windows/Mac 上执行)
GOOS=linux GOARCH=amd64 go build -o app-linux .
# 编译 Windows 可执行文件
GOOS=windows GOARCH=amd64 go build -o app.exe .
# 编译 Mac 可执行文件
GOOS=darwin GOARCH=arm64 go build -o app-mac .
# Windows 下交叉编译(PowerShell)
$env:GOOS="linux"; $env:GOARCH="amd64"; go build -o app-linux .
|
六、输出与基本 I/O
6.1 fmt 包 — 格式化输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package main
import "fmt"
func main() {
name := "Go"
version := 1.24
// 基本输出
fmt.Println("Hello", name) // 输出后换行
fmt.Printf("版本: %.2f\n", version) // 格式化输出
// 格式化并返回字符串(不输出)
s := fmt.Sprintf("Hello %s", name)
// 格式化动词
fmt.Printf("字符串: %s\n", "hello") // 字符串
fmt.Printf("整数: %d\n", 42) // 十进制整数
fmt.Printf("浮点: %.2f\n", 3.14159) // 保留2位小数
fmt.Printf("布尔: %t\n", true) // 布尔值
fmt.Printf("类型: %T\n", name) // 变量类型
fmt.Printf("值: %v\n", struct{}{}) // 默认格式
fmt.Printf("详细: %+v\n", struct{}{}) // 带字段名
}
|
6.2 常用格式化动词
1
2
3
4
5
6
7
8
9
10
|
%s — 字符串
%d — 十进制整数
%f — 浮点数(%.2f 保留2位小数)
%t — 布尔值
%T — 类型
%v — 默认格式(万能)
%+v — 带字段名的格式(用于结构体)
%p — 指针地址
%c — 字符(Unicode 码点转字符)
%02d — 至少2位,不足补0
|
七、小结
本文完成了以下内容:
- Go 环境安装与配置
- 第一个 Go 程序的编写与运行
- Go 代码的基本结构(package、import、main)
- go mod 依赖管理
- 常用工具链命令
下一篇将学习 Go 的基础语法,包括变量声明、数据类型、流程控制和函数。