Go 代码格式化速查
gofmt / goimports / golint / staticcheck · 点击命令复制
Go 代码标准格式化(不运行)
gofmt / goimports / golint / staticcheck · 点击命令复制
了解工具定位 · 使用场景 · 对比优势
Go 开源贡献者在提 PR 前,需要确保代码符合 Go 官方标准格式,否则 CI 检查会直接驳回。本工具在线格式化代码,无需本地安装 Go 环境,粘贴代码即可一键对齐缩进、调整括号位置、修正空格,避免因格式问题被机器人打回,节省反复提交的等待时间。
Go 讲师在批改学生作业时,常遇到缩进混乱、大括号不换行等格式问题。逐行手动纠正耗时且容易漏改。使用本工具批量格式化学生代码,统一输出标准风格,让讲师能专注逻辑错误而非格式细节,同时给学生展示“Go 官方推荐写法”的直观范例。
接手老项目的 Go 开发者面对数百行无缩进、混合制表符与空格的代码,手动整理效率极低。本工具一次性格式化整个文件,自动将制表符转为空格、对齐函数参数、统一 import 分组,让混乱的代码在几秒内变成可读结构,为后续重构扫清视觉障碍。
使用 ChatGPT / Copilot 生成 Go 代码片段时,输出常包含不一致的空格和换行。将 AI 生成的代码粘贴到本工具,立即转为 gofmt 标准格式,消除因格式问题导致的编译警告,确保 AI 代码能直接嵌入项目而不触发 lint 规则。
运维或前端工程师在排查 Go 服务日志时,偶尔需要阅读或粘贴 Go 代码片段。本地未安装 Go SDK 无法运行 gofmt。本工具纯浏览器运行,无需安装任何依赖,打开页面即用,快速格式化他人分享的代码片段,提升跨团队协作效率。
| 维度 | 本工具 | go fmt (官方命令行) | gofmt 在线 (其他网站) |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,代码不上传 | 本地处理,代码不离开机器 | 代码上传至服务器处理 |
| 处理速度 | 1 秒内 | 即时(本地执行) | 取决于服务器负载和网络,通常 1-3 秒 |
| 离线可用 | 需网络加载,加载后可离线使用 | 完全离线 | 完全依赖网络 |
| 大小限制 | 无限制(受浏览器内存影响) | 无限制 | 通常有 1-10 KB 限制 |
| 环境依赖 | 仅需浏览器 | 需安装 Go 环境 | 仅需浏览器 |
| 使用场景 | 快速格式化,无需安装环境 | 本地开发、CI/CD 集成 | 临时格式化,不关心隐私 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| package main func main() { var x int = 1 fmt.Println(x) } | package main func main() { var x int = 1 fmt.Println(x) } | 典型场景:修复未缩进的代码 |
| package main func add(a int,b int) int { return a+b } | package main func add(a int, b int) int { return a + b } | 典型场景:统一参数和运算符间距 |
| package main func main() { if true { fmt.Println("ok") } } | package main func main() { if true { fmt.Println("ok") } } | 边界 case:if 块内代码缩进对齐 |
| package main func main() { var ( a=1 b=2 ) } | package main func main() { var ( a = 1 b = 2 ) } | 边界 case:多变量声明块缩进 |
| package main func main() { // comment fmt.Println("hello") } | package main func main() { // comment fmt.Println("hello") } | 易错 case:注释行后的代码缩进 |
| package main func main() { s:="a"+ "b" } | package main func main() { s := "a" + "b" } | 易错 case:跨行字符串拼接对齐 |
| package main import "fmt" func main() { fmt.Println("hello") } | package main import "fmt" func main() { fmt.Println("hello") } | 典型场景:import 与函数体缩进 |
func main() { panic("test") } // 期望工具报错func main() { panic("test") } // 格式化后不会报错,只是重新排版gofmt 只做语法层面的格式化(缩进/换行/括号),不执行代码,也不检查变量作用域或逻辑错误。
<html><body>Hello</body></html>package main
func main() {
fmt.Println("Hello")
}gofmt 只解析 Go 语法树;传入 HTML/JSON 等非 Go 代码会导致解析失败(token 错误),工具无法输出格式化结果。
func foo() {
return 1
} // 4 个空格缩进func foo() {
return 1
} // 1 个制表符缩进gofmt 强制使用制表符(tab)缩进,宽度由编辑器决定。手动打空格会被统一替换为 tab。
import "fmt" "os"import (
"fmt"
"os"
)Go 中多个 import 必须用分组形式(带括号),单行只允许一个包路径。gofmt 会自动拆分和排序。
if (x > 0) { return x }if x > 0 { return x }Go 的 if/for 条件不需要括号,gofmt 会自动移除。保留括号不会报错但不符合官方风格。
if x > 0 {
return 1
}
else {
return 0
}if x > 0 {
return 1
} else {
return 0
}Go 强制 else 必须与 if 的右花括号在同一行,否则会触发语法错误(分号插入规则)。
s := []int{
1,
2
}s := []int{
1,
2,
}Go 的多行复合字面量(slice/map/struct)要求每行末尾都有逗号,包括最后一行。gofmt 会自动补全。
// 这是一段注释
func main() { }// 这是一段注释
func main() {}gofmt 不会修改注释内容,但会调整注释与代码之间的空行。如果注释后有多余空行,工具会保留或删除取决于上下文。
公式推导 · 流程图解 · 依据出处
output = gofmt(input)
input — 输入的 Go 源码文本output — 标准格式化后的 Go 源码文本输入:func add(a int,b int)int{return a+b}。经过 gofmt 处理后,输出:func add(a int, b int) int { return a + b }。gofmt 自动添加了参数间的空格、返回值类型前的空格、操作符两侧的空格,并统一了缩进。
适用于任意合法的 Go 源码文件(.go)。不适用于非 Go 语言代码或语法错误的 Go 代码(gofmt 会报错)。gofmt 是 Go 官方工具,遵循 Go 语言规范(golang.org/cmd/gofmt)。
3 种主流语言 · 复制即用
package main
import (
"fmt"
"go/format"
"log"
)
func main() {
// 待格式化的 Go 源码
src := `package main
import "fmt"
func main(){
fmt.Println("hello")
}`
// format.Source 只格式化,不运行
formatted, err := format.Source([]byte(src))
if err != nil {
log.Fatal(err)
}
fmt.Println(string(formatted))
// 输出:
// package main
//
// import "fmt"
//
// func main() {
// fmt.Println("hello")
// }
}import subprocess
import tempfile
import os
# 使用 gofmt 命令行工具格式化 Go 代码
src = '''package main
import "fmt"
func main(){
fmt.Println("hello")
}'''
# 写入临时文件
with tempfile.NamedTemporaryFile(mode='w', suffix='.go', delete=False) as f:
f.write(src)
tmpfile = f.name
try:
# 调用 gofmt(需已安装 Go)
result = subprocess.run(['gofmt', tmpfile], capture_output=True, text=True)
if result.returncode != 0:
print('格式化错误:', result.stderr)
else:
print(result.stdout)
# 输出:
# package main
#
# import "fmt"
#
# func main() {
# fmt.Println("hello")
# }
finally:
os.unlink(tmpfile)// 使用 wasm 版 gofmt 在浏览器中格式化(需加载 gofmt.wasm)
// 此处演示调用假设的 wasm 导出函数
async function formatGoCode(src) {
// 假设 wasm 模块已加载,导出 formatGo 函数
// const gofmt = await WebAssembly.instantiateStreaming(fetch('gofmt.wasm'));
// const formatGo = gofmt.instance.exports.formatGo;
// 模拟格式化结果(实际需替换为真实 wasm 调用)
const formatted = `package main
import "fmt"
func main() {
\tfmt.Println("hello")
}`;
return formatted;
}
const src = `package main
import "fmt"
func main(){
fmt.Println("hello")
}`;
formatGoCode(src).then(result => {
console.log(result);
// 输出:
// package main
//
// import "fmt"
//
// func main() {
// fmt.Println("hello")
// }
});8 个高频疑问