Skip to content

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.go

2. 格式化规则

go fmt 遵循以下规则:

  1. 缩进:使用 Tab(不是空格)
  2. 行长度:不强制限制,但建议不超过 120 字符
  3. 括号:控制结构不需要括号
  4. 导入:自动排序和分组
  5. 注释:保持注释格式

📝 详细示例

示例 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.go

2. 简化代码(-s 标志)

bash
# 简化代码
gofmt -s file.go
go
var x []int
x = append(x, 1)
x = append(x, 2)

var m = map[string]int{}
m["key"] = 1
go
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 -u

3. 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 只改变代码格式,不改变代码逻辑。

📖 参考资源

正在精进