Go 学习笔记(一):环境搭建与入门基础

写在前面

这是 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 的基础语法,包括变量声明、数据类型、流程控制和函数。