go fmt - 代码格式化工具
go fmt 是 Go 官方提供的代码格式化工具,用于统一代码风格。
📋 概述
难度级别:⭐
考察范围:代码规范/工具使用
技术标签:代码格式化 代码规范 工具
问题分析
go fmt 是 Go 开发中最常用的工具之一,它能够自动格式化代码,确保代码风格统一。
🎯 核心功能
1. 基本用法
bash
# 格式化当前包
go fmt
# 格式化指定包
go fmt ./pkg/...
# 格式化所有包
go fmt ./...
# 格式化单个文件
go fmt file.go
# 显示被格式化的文件
go fmt -w file.go2. 格式化规则
go fmt 遵循以下规则:
- 缩进:使用 Tab(不是空格)
- 行长度:不强制限制,但建议不超过 120 字符
- 括号:控制结构不需要括号
- 导入:自动排序和分组
- 注释:保持注释格式
📝 详细示例
示例 1:基本格式化
go
package main
import "fmt"
import "os"
func main(){
if true{
fmt.Println("Hello")
}
}go
package main
import (
"fmt"
"os"
)
func main() {
if true {
fmt.Println("Hello")
}
}示例 2:导入排序
go
package main
import (
"os"
"fmt"
"strings"
"github.com/example/pkg"
"encoding/json"
)go
package main
import (
"encoding/json"
"fmt"
"os"
"strings"
"github.com/example/pkg"
)规则:
- 标准库包在前
- 第三方包在后
- 用空行分隔不同组
示例 3:结构体格式化
go
type User struct{
Name string
Age int
Email string
}go
type User struct {
Name string
Age int
Email string
}🔧 高级用法
1. 使用 gofmt 直接格式化
go fmt 实际上是 gofmt 的包装器:
bash
# 直接使用 gofmt
gofmt -w file.go
# 显示差异
gofmt -d file.go
# 简化代码
gofmt -s file.go
# 重写规则
gofmt -r 'old -> new' file.go2. 简化代码(-s 标志)
bash
# 简化代码
gofmt -s file.gogo
var x []int
x = append(x, 1)
x = append(x, 2)
var m = map[string]int{}
m["key"] = 1go
var x []int
x = append(x, 1, 2)
var m = map[string]int{"key": 1}3. 重写规则(-r 标志)
bash
# 将 a.Foo() 重写为 a.Bar()
gofmt -r 'a.Foo -> a.Bar' file.go🎯 最佳实践
1. 编辑器自动格式化
VS Code:
json
{
"editor.formatOnSave": true,
"[go]": {
"editor.defaultFormatter": "golang.go"
}
}GoLand:
- Settings → Editor → Code Style → Go
- 启用 "Reformat code on save"
2. 预提交钩子
bash
#!/bin/sh
# .git/hooks/pre-commit
go fmt ./...
git add -u3. CI/CD 集成
yaml
# .github/workflows/ci.yml
- name: Check formatting
run: |
go fmt ./...
git diff --exit-code📊 格式化规则详解
| 规则 | 说明 | 示例 |
|---|---|---|
| 缩进 | 使用 Tab | \t |
| 大括号 | 左大括号不换行 | if x { |
| 导入 | 自动排序分组 | 标准库 → 第三方 |
| 注释 | 保持原格式 | // Comment |
| 行尾空格 | 自动删除 | - |
🔍 常见问题
Q1: go fmt 和 gofmt 的区别?
go fmt:是gofmt的包装器,会格式化整个包gofmt:底层工具,可以格式化单个文件
建议: 使用 go fmt 格式化包,使用 gofmt 格式化单个文件。
Q2: 如何禁用某些格式化规则?
go fmt 不提供禁用选项,但可以使用 gofmt 的 -r 选项自定义规则。
Q3: 格式化会改变代码逻辑吗?
不会。go fmt 只改变代码格式,不改变代码逻辑。
