gofmt 在线格式化

Go 代码标准格式化(不运行)

408 次访问

Go 代码格式化速查

gofmt / goimports / golint / staticcheck · 点击命令复制

关于本工具

了解工具定位 · 使用场景 · 对比优势

使用场景

🧹

开源项目提交前

Go 开源贡献者在提 PR 前,需要确保代码符合 Go 官方标准格式,否则 CI 检查会直接驳回。本工具在线格式化代码,无需本地安装 Go 环境,粘贴代码即可一键对齐缩进、调整括号位置、修正空格,避免因格式问题被机器人打回,节省反复提交的等待时间。

📚

Go 教学代码审阅

Go 讲师在批改学生作业时,常遇到缩进混乱、大括号不换行等格式问题。逐行手动纠正耗时且容易漏改。使用本工具批量格式化学生代码,统一输出标准风格,让讲师能专注逻辑错误而非格式细节,同时给学生展示“Go 官方推荐写法”的直观范例。

🔧

遗留代码重构前

接手老项目的 Go 开发者面对数百行无缩进、混合制表符与空格的代码,手动整理效率极低。本工具一次性格式化整个文件,自动将制表符转为空格、对齐函数参数、统一 import 分组,让混乱的代码在几秒内变成可读结构,为后续重构扫清视觉障碍。

🤖

AI 生成代码校验

使用 ChatGPT / Copilot 生成 Go 代码片段时,输出常包含不一致的空格和换行。将 AI 生成的代码粘贴到本工具,立即转为 gofmt 标准格式,消除因格式问题导致的编译警告,确保 AI 代码能直接嵌入项目而不触发 lint 规则。

💻

无 Go 环境的临时调试

运维或前端工程师在排查 Go 服务日志时,偶尔需要阅读或粘贴 Go 代码片段。本地未安装 Go SDK 无法运行 gofmt。本工具纯浏览器运行,无需安装任何依赖,打开页面即用,快速格式化他人分享的代码片段,提升跨团队协作效率。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具go fmt (官方命令行)gofmt 在线 (其他网站)
数据隐私纯浏览器处理,代码不上传本地处理,代码不离开机器代码上传至服务器处理
处理速度1 秒内即时(本地执行)取决于服务器负载和网络,通常 1-3 秒
离线可用需网络加载,加载后可离线使用完全离线完全依赖网络
大小限制无限制(受浏览器内存影响)无限制通常有 1-10 KB 限制
环境依赖仅需浏览器需安装 Go 环境仅需浏览器
使用场景快速格式化,无需安装环境本地开发、CI/CD 集成临时格式化,不关心隐私

使用指南

上手步骤 · 输入输出 · 避坑提示

输入输出示例7 个典型场景,覆盖常规、边界与易错

输入输出说明
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 与函数体缩进

常见错误对照8 个常踩的坑 · 错误 → 修复

1. 误以为会运行代码或检查逻辑

错误
func main() { panic("test") }   // 期望工具报错
修复
func main() { panic("test") }   // 格式化后不会报错,只是重新排版

gofmt 只做语法层面的格式化(缩进/换行/括号),不执行代码,也不检查变量作用域或逻辑错误。

2. 把非 Go 文件当作 Go 代码格式化

错误
<html><body>Hello</body></html>
修复
package main

func main() {
	fmt.Println("Hello")
}

gofmt 只解析 Go 语法树;传入 HTML/JSON 等非 Go 代码会导致解析失败(token 错误),工具无法输出格式化结果。

3. 用制表符缩进但期望保留空格

错误
func foo() {
    return 1
}   // 4 个空格缩进
修复
func foo() {
	return 1
}   // 1 个制表符缩进

gofmt 强制使用制表符(tab)缩进,宽度由编辑器决定。手动打空格会被统一替换为 tab。

4. 忘记 import 语句的换行规则

错误
import "fmt" "os"
修复
import (
	"fmt"
	"os"
)

Go 中多个 import 必须用分组形式(带括号),单行只允许一个包路径。gofmt 会自动拆分和排序。

5. 在 if/for 条件中加多余括号

错误
if (x > 0) { return x }
修复
if x > 0 { return x }

Go 的 if/for 条件不需要括号,gofmt 会自动移除。保留括号不会报错但不符合官方风格。

6. 在 else 前换行

错误
if x > 0 {
	return 1
}
else {
	return 0
}
修复
if x > 0 {
	return 1
} else {
	return 0
}

Go 强制 else 必须与 if 的右花括号在同一行,否则会触发语法错误(分号插入规则)。

7. 结构体/切片字面量多行时末尾漏逗号

错误
s := []int{
	1,
	2
}
修复
s := []int{
	1,
	2,
}

Go 的多行复合字面量(slice/map/struct)要求每行末尾都有逗号,包括最后一行。gofmt 会自动补全。

8. 把错误类型当作注释格式

错误
// 这是一段注释
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)。

原理图

原始 Go 代码(粘贴到输入框)WASM 解析 ASTgo/parser → go/astgo/printer 重新输出格式化代码(可复制 / 下载)隐私说明所有处理在浏览器本地完成,代码不会上传到任何服务器。即使断网,已加载的页面仍可正常格式化代码。
用户输入 本地处理 输出结果

开发者集成

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 个高频疑问

这个 gofmt 在线工具怎么用?我把代码粘贴进去,点格式化后没反应?
检查一下输入框是否为空,或者代码里有没有语法错误。gofmt 只接受合法的 Go 源代码,如果代码里有拼写错误、不匹配的括号或未定义的变量,工具会报错并提示具体行号,不会输出格式化结果。正确的流程是:将 Go 代码(比如一个完整的 .go 文件内容)粘贴到左侧输入框,点击「格式化」按钮,右侧输出框会显示 gofmt 标准格式化后的代码。支持文件上传或直接粘贴,但必须确保代码本身能通过 go build 的语法检查。
为什么我用 gofmt 在线格式化后,代码缩进变了,但括号位置好像没改?
这是正常的。gofmt 的核心规则是强制使用 Tab 缩进(不是空格),并统一运算符前后空格、分行等排版风格。但它不会改动你的代码逻辑结构,比如 if/for 的大括号位置(Go 官方风格要求左大括号不换行,如果你的代码本就不换行,它不会改)。如果发现括号位置变了,说明你原来的代码不符合 Go 官方规范(比如左大括号单独占一行),gofmt 会自动修正。另外,gofmt 不会改变注释内容或代码字符串。
这个工具是纯前端处理的吗?我的代码会不会被上传到服务器?
完全纯浏览器端处理。工具使用 WebAssembly (WASM) 技术将 Go 标准库中的 gofmt 编译成可以在浏览器中运行的模块,所有格式化操作都在你的电脑内存里完成。你可以通过浏览器开发者工具的网络面板(Network Tab)确认:点击格式化按钮时,没有任何 HTTP 请求发出。因此,即使断网也能正常使用,代码隐私有保障。关闭标签页后,内存中的代码数据即被清除。
gofmt 和 gofmt -s 有什么区别?这个在线工具支持 -s 参数吗?
gofmt 默认只做标准格式化(缩进、空格、换行等)。gofmt -s 是「简化模式」,会额外对代码进行简化重写,比如将 `a[i:len(a)]` 简化为 `a[i:]`、移除不必要的类型声明等。当前在线工具默认启用 -s 简化功能,输出结果等同于命令行执行 `gofmt -s`。如果不需要简化,可以留意工具界面上是否有「启用简化」的开关(通常默认开启)。简化后的代码更简洁,但不改变语义。
我把别人写的 Go 代码粘贴进去格式化,为什么结果和原版不一样?
有两种可能。第一种是对方的代码本身不符合 gofmt 规范(比如用了 4 空格缩进),工具会自动纠正为标准格式,所以看起来「变了」。第二种是对方可能使用了 gofmt 的某些非默认选项(如 `-r` 规则重写),而本工具只支持标准格式化 + 简化(-s)。要得到完全一致的输出,可以要求对方用 `gofmt -l` 检查代码是否已格式化。另外,如果代码里包含 go.mod 依赖信息,gofmt 不会处理,只关注 .go 源文件本身。
这个工具能处理大型 Go 项目吗?比如一个有几千行的文件?
可以,但受浏览器性能限制。纯前端 WASM 方式处理时,代码大小和格式化速度成正比。对于 500 行以内的常见文件,几乎是秒出结果。对于 5000 行以上的大文件,格式化可能需要 2-5 秒(取决于电脑性能),浏览器界面可能会短暂无响应,这是正常现象。如果文件超过 1 万行,建议使用命令行工具 `gofmt -w` 直接本地格式化,效率更高。另外,工具不接受单个文件超过 2MB(约 5 万行代码),超出时会提示上传失败。
gofmt 在线工具和 GoLand、VS Code 里的自动格式化有什么区别?
核心算法完全一样,都是调用 Go 标准库的 `go/format` 包。区别在于使用场景:在线工具无需安装任何软件,打开浏览器就能用,适合临时格式化或检查他人代码。IDE 插件(如 GoLand 的 Reformat Code、VS Code 的 Go 扩展)会在保存文件时自动调用 gofmt,且能集成到项目中。在线工具的输出结果和 IDE 格式化结果 100% 一致(前提是 IDE 没有额外配置 `gofumpt` 等更严格的格式化工具)。如果发现不一致,通常是 IDE 开启了其他格式化插件。
我格式化后代码变红了,提示「expected declaration, found xxx」,是不是工具坏了?
不是工具问题。这个错误说明你的代码中存在语法错误,比如漏写了 `package main`、函数声明不完整、或者某行末尾多了个逗号。gofmt 在格式化前会先对代码进行词法分析和语法解析,如果无法解析为有效的 Go AST(抽象语法树),就会报错并停止格式化。请检查代码中是否有未闭合的字符串、不匹配的括号、或者从网页复制时混入了不可见字符(如零宽空格)。可以先用 `go vet` 或本地编译器定位错误行,修复后再粘贴进来。
选择 打开 +新窗口 esc关闭