开发者工具 · Go 全栈

gofmt 在线格式化

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

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 45 次使用

Go 代码格式化速查

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

第一节

关于本工具

About

提交 PR 前发现 gofmt 报错,或接手他人代码缩进混乱、花括号不统一。这个工具在浏览器中直接运行标准库 gofmt 的格式化逻辑,输入代码即可得到符合官方规范的输出——不执行、不编译,仅做词法重排。所有处理在本地完成,代码不上传服务器,适合在无 Go 环境的设备上快速对齐格式。

使用场景

PR合入前格式自检

向开源项目提 PR 前,本地 `gofmt` 版本与 CI 流水线版本不一致,导致 CI 报格式错误被驳回。把待提交的 `.go` 文件内容粘贴到本工具,直接看到 CI 环境(Go 1.20+)下的格式化结果。对照输出修正本地代码,确保 PR 一次通过,避免因缩进、空行、括号位置等非逻辑问题反复触发流水线重跑。

团队代码风格评审

团队内有人用制表符、有人用空格,`if` 语句的 `else` 换行位置不统一。Code Review 时,评审者把争议代码段粘贴到本工具,格式化后所有风格差异消失。评审焦点从“缩进该几个空格”拉回到“逻辑是否健壮”,减少因风格分歧导致的讨论耗时。

面试代码题阅卷

候选人提交的 Go 代码手写题,换行、对齐混乱,无法快速判断逻辑是否正确。面试官把代码复制进本工具,格式化后的代码结构清晰,函数边界、嵌套层级一目了然。结合格式化后的代码逐行追问候选人思路,避免因排版问题误判候选人编码能力。

从博客/问答复制代码

在 Stack Overflow 或技术博客上找到一段 Go 代码片段,复制后缩进全乱、存在多余空行。直接运行会报语法错误。把片段粘贴到本工具,格式化后恢复标准 Go 风格,同时能发现复制过程中是否丢失了花括号或分号,确保粘贴后的代码可直接编译测试。

旧项目遗留代码整理

接手一个用 `go fmt` 前时代写的项目,文件内混用 2 空格和 4 空格缩进,`import` 分组混乱。逐个文件复制到本工具批量格式化,输出结果符合当前 Go 官方规范。整理后 `git diff` 只显示格式变更,后续提交的代码差异清晰可读,降低维护成本。

第二节

使用指南

Getting Started

使用步骤

  1. 1将 Go 源码粘贴到左侧编辑区,或点击「从文件加载」上传 .go 文件,代码高亮即时生效
  2. 2点击「格式化」按钮,右侧预览区立即显示经过 gofmt 标准化的代码,缩进与括号对齐自动修正
  3. 3对比左右两侧差异:左侧保留原始代码,右侧展示格式化后结果,不一致处高亮标注
  4. 4点击「复制结果」将格式化后的代码存入剪贴板,或「下载 .go」保存为文件

输入输出示例

输入输出说明
package main func main() { var x int = 1 if true { println(x) } }package main func main() { var x int = 1 if true { println(x) } }常规:缩进和花括号位置被标准化为 tab 缩进,if 语句体自动缩进
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() { s := "hello" _ = s }package main func main() { s := "hello" _ = s }边界:空代码(仅有声明和空白符使用)—— 格式化后无变化,验证工具不引入多余换行
package main func main() { // 注释 /* 块注释 */ }package main func main() { // 注释 /* 块注释 */ }边界:纯注释代码 —— 注释内容、位置、缩进均保持不变,验证工具不修改注释
package main func f() { x := 1 _ = x }package main func f() { x := 1 _ = x }边界:单语句函数体 —— 花括号内仅一条语句,格式化后无多余空行
package main func main() { if true { println("a") } else { println("b") } }package main func main() { if true { println("a") } else { println("b") } }易错:else 与 if 右花括号同行 —— gofmt 强制要求 else 不能另起一行,此处已符合规范,输出不变;若写成换行格式会被修正
package main func main() { for i := 0; i < 10; i++ { } }package main func main() { for i := 0; i < 10; i++ { } }易错:空循环体 —— 花括号内无语句,格式化后保留空花括号,不插入空行或注释

常见错误对照

1.未正确处理缩进——制表符 vs 空格

✗ 错误func main() { fmt.Println("hello") }
✓ 修复func main() { fmt.Println("hello") }

gofmt 强制使用制表符(tab)缩进,空格缩进会被自动替换。手动混用空格会导致格式化后代码缩进不一致,违反 Go 官方规范。

2.导入路径未排序或分组错误

✗ 错误import ( "fmt" "os" "strings" )
✓ 修复import ( "fmt" "os" "strings" )

gofmt 会自动将导入按字母序排序,但不会合并重复或拆分标准库/第三方分组。若代码中导入顺序混乱,格式化后可能仍不符合 goimports 的语义分组习惯。

3.行尾多余空格或空行未清理

✗ 错误func add(a int, b int) int { return a + b }
✓ 修复func add(a int, b int) int { return a + b }

gofmt 会删除行尾多余空格,并合并连续空行为一个空行。但不会删除文件末尾多余空行,需手动检查或配合其他工具清理。

4.运算符周围缺少空格

✗ 错误x:=a+b*c
✓ 修复x := a + b*c

gofmt 强制在二元运算符(如 +、-、*、/)两侧加空格,但一元运算符(如 * 指针解引用)不加。错误写法会导致格式化后代码可读性差,且可能改变运算优先级意图。

5.函数参数类型声明冗余

✗ 错误func add(a int, b int) int { return a + b }
✓ 修复func add(a, b int) int { return a + b }

gofmt 不会自动合并连续相同类型的参数声明,但 Go 语言允许省略重复类型。手动冗余书写不会报错,但不符合 Go 简洁风格,且增加阅读负担。

6.错误处理中 if 语句缺少简短声明

✗ 错误err := doSomething() if err != nil { return err }
✓ 修复if err := doSomething(); err != nil { return err }

gofmt 不强制使用 if 简短声明,但 Go 社区推荐在错误处理中合并声明与判断。分开写不会报错,但代码更冗长,且 err 作用域扩大可能引发意外覆盖。

7.结构体字面量多行时尾部逗号缺失

✗ 错误person := Person{ Name: "Alice", Age: 30 }
✓ 修复person := Person{ Name: "Alice", Age: 30, }

gofmt 要求多行结构体字面量的最后一个字段后加逗号。缺失逗号不会报错,但格式化后会自动补上,若手动删除会导致下次格式化时重新添加,形成循环修改。

8.注释与代码对齐不当

✗ 错误// 计算总和 func sum(a, b int) int { return a + b }
✓ 修复// 计算总和 func sum(a, b int) int { return a + b }

gofmt 不会调整注释缩进,但要求注释紧贴被注释代码。若注释与代码间有空行,gofmt 会保留空行,导致注释与代码分离,影响可读性。

第三节

工作原理

How It Works

核心公式

gofmt 输出 = gofmt(输入 Go 源码)

变量说明

  • 输入 Go 源码待格式化的 Go 语言源代码文本
  • gofmt 输出符合 Go 官方规范的格式化后代码

示例

输入 Go 源码:`func add(a int,b int)int{return a+b}`。gofmt 处理后输出:`func add(a int, b int) int { return a + b }`。规则包括:操作符两侧加空格、参数逗号后加空格、花括号换行对齐、缩进统一为 tab。

Go 源码输入词法分析(Token 拆分)语法树构建(AST 解析)格式化重排(缩进/换行)标准代码输出(不运行)
用户输入 本地处理 输出结果
第五节

常见问题

Q & A
我直接复制粘贴一大段 Go 代码进去,格式化后会不会改变代码的逻辑?

不会。gofmt 只做代码的**标准格式化**,比如调整缩进、对齐、括号位置、换行等,不修改任何变量名、函数逻辑或注释内容。你可以把格式化前后的代码用 diff 工具对比,会发现只有空白符和排版的变化。放心,逻辑 100% 不变。

这个工具能处理 Go 1.18 之后的泛型代码吗?

可以。本工具底层使用 Go 官方标准库的 gofmt 逻辑,支持 Go 1.18 及之后引入的泛型语法(类型参数、约束、实例化等)。你贴入包含泛型定义的代码,格式化后泛型部分(如 [T any] 的缩进、换行)会按官方规范重新排版。如果遇到格式化报错,通常是代码本身有语法错误,建议先本地 go build 确认无误。

为什么我贴进去的代码格式化后,有些长一行被拆成了多行?

gofmt 会遵循 Go 官方的**行宽限制**(默认 80 字符左右),当一行代码超过该宽度时,会自动在合适位置(如运算符、括号后)换行,以保证代码横向可读性。这是 gofmt 的标准行为,不是 bug。如果你希望保留原换行风格,可先手动调整代码长度,但建议遵循官方规范,便于团队协作。

代码格式化后,我的多行字符串或 raw string literal 被改变了,怎么回事?

gofmt **不会修改字符串字面量**(包括双引号字符串、反引号 raw string)的内容,也不会更改其中的换行或空格。如果你看到字符串部分排版变了,只可能是字符串外部的代码缩进或括号对齐影响了整段代码的视觉排列。字符串内部内容绝对原样保留。如果确实发现内容变化,请检查是否贴错了代码片段。

格式化时提示 'expected declaration, found...' 错误,是工具不支持还是我代码有问题?

这是 Go 语法错误提示,说明你贴的代码片段不完整或不符合 Go 语法规范。gofmt 只接受**完整的 Go 源文件**(以 package 开头),不接受孤立表达式或语句。常见原因:只贴了函数体没贴函数签名、缺少 import 语句、或粘贴了多段代码混在一起。建议贴入一个完整的 .go 文件内容,或在本地先用 go fmt 验证。

这个在线格式化工具会上传我的代码到服务器吗?安全吗?

本工具采用**纯前端 WASM 实现**,所有格式化操作都在你的浏览器本地完成,代码不会被发送到任何服务器。你粘贴的代码只在内存中处理,刷新页面或关闭标签页后即消失。如果你处理的是公司私有项目代码,可放心使用。建议不要在公共电脑上粘贴敏感代码,并注意清除浏览器缓存。

gofmt 在线格式化和我在本地用 go fmt 命令,结果完全一样吗?

完全一样。本工具底层使用的是 Go 官方提供的 wasm 编译版本 gofmt,算法和本地 go fmt 命令完全一致。你可以把同一段代码在两处分别格式化,输出结果逐字符相同。区别仅在于在线版无需安装 Go 环境,适合临时快速格式化或学习调试。

我贴了代码但格式化后没任何变化,是不是工具坏了?

大概率不是工具问题。gofmt 只在代码**不符合官方格式规范**时才会做修改。如果你的代码已经符合标准(比如从 gofmt 格式化过的项目里复制),输出会原样返回。你可以故意加些不规范缩进或多余空行再试,确认工具正常工作。如果代码明显不规范却没变化,请检查是否贴错了语言(非 Go 代码 gofmt 不会处理)。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭