对于一门编程语言来说,代码格式化是最容易引起争议的一个问题,不同的开发者可能会有不同的编码风格和习惯,但是如果所有开发者都能使用同一种格式来编写代码,那么开发者就可以将主要精力放在语言要解决的问题上,从而节省开发时间。

gofmt 介绍

Go语言的开发团队制定了统一的官方代码风格,并且推出了 gofmt 工具(gofmt 或 go fmt)来帮助开发者格式化他们的代码到统一的风格。

gofmt 是一个 cli 程序,会优先读取标准输入,如果传入了文件路径的话,会格式化这个文件,如果传入一个目录,会格式化目录中所有 .go 文件,如果不传参数,会格式化当前目录下的所有 .go 文件。

gofmt 默认不对代码进行简化,使用-s参数可以开启简化代码功能,具体来说会进行如下的转换:

1) 去除数组、切片、Map 初始化时不必要的类型声明

如下形式的切片表达式:

[]T{T{}, T{}}

简化后的代码为:

[]T{{}, {}}

2) 去除数组切片操作时不必要的索引指定

如下形式的切片表达式:

s[a:len(s)]

简化后的代码为:

s[a:]

3) 去除循环时非必要的变量赋值

如下形式的循环:

for x, _ = range v {...}

简化后的代码为:

for x = range v {...}

如下形式的循环:

for _ = range v {...}

简化后的代码为:

for range v {...}

gofmt 命令参数如下表所示:

标记名称

标记描述

-l

仅把那些不符合格式化规范的、需要被命令程序改写的源码文件的绝对路径打印到标准输出。而不是把改写后的全部内容都打印到标准输出。

-w

把改写后的内容直接写入到文件中,而不是作为结果打印到标准输出。

-r

添加形如“a[b:len(a)] -> a[b:]”的重写规则。如果我们需要自定义某些额外的格式化规则,就需要用到它。

-s

简化文件中的代码。

-d

只把改写前后内容的对比信息作为结果打印到标准输出。而不是把改写后的全部内容都打印到标准输出。

命令程序将使用 diff 命令对内容进行比对。在 Windows 操作系统下可能没有 diff 命令,需要另行安装。

-e

打印所有的语法错误到标准输出。如果不使用此标记,则只会打印每行的第 1 个错误且只打印前 10 个错误。

-comments

是否保留源码文件中的注释。在默认情况下,此标记会被隐式的使用,并且值为 true。

-tabwidth

此标记用于设置代码中缩进所使用的空格数量,默认值为 8。要使此标记生效,需要使用“-tabs”标记并把值设置为 false。

-tabs

是否使用 tab('\t')来代替空格表示缩进。在默认情况下,此标记会被隐式的使用,并且值为 true。

-cpuprofile

是否开启 CPU 使用情况记录,并将记录内容保存在此标记值所指的文件中。

可以看到 gofmt 命令还支持自定义的重写规则,使用-r参数,按照 pattern -> replacement 的格式传入规则。

【示例】有如下内容的 Golang 程序,存储在 main.go 文件中。

package main

import "fmt"

func main() {

a := 1

b := 2

c := a + b

fmt.Println(c)

}

用以下规则来格式化上面的代码。

gofmt -w -r "a + b -> b + a" main.go

格式化的结果如下。

package main

import "fmt"

func main() {

a := 1

b := 2

c := b + a

fmt.Println(c)

}

注意:gofmt 使用 tab 来表示缩进,并且对行宽度无限制,如果手动对代码进行了换行,gofmt 不会强制把代码格式化回一行。

go fmt 和 gofmt

gofmt 是一个独立的 cli 程序,而Go语言中还有一个go fmt命令,go fmt命令是 gofmt 的简单封装。

go help fmt

usage: go fmt [-n] [-x] [packages]

Fmt runs the command 'gofmt -l -w' on the packages named

by the import paths. It prints the names of the files that are modified.

For more about gofmt, see 'go doc cmd/gofmt'.

For more about specifying packages, see 'go help packages'.

The -n flag prints commands that would be executed.

The -x flag prints commands as they are executed.

To run gofmt with specific options, run gofmt itself.

See also: go fix, go vet.

go fmt命令本身只有两个可选参数-n和-x:

-n仅打印出内部要执行的go fmt的命令;

-x命令既打印出go fmt命令又执行它,如果需要更细化的配置,需要直接执行 gofmt 命令。

go fmt在调用 gofmt 时添加了-l -w参数,相当于执行了gofmt -l -w。

php 代码格式化命令,go fmt命令——格式化代码文件相关推荐

  1. CentOS硬盘挂载之fdisk命令进行查看/分区/格式化/挂载

    CentOS硬盘挂载之fdisk命令进行查看/分区/格式化/挂载 此教程是博主亲自帮朋友管理服务器所操作的完整步骤,当然此步骤适合所有的linux-centos系统,不管centos怎么变,linux ...

  2. 在Mac中如何通过命令对NTFS磁盘格式化

    2019独角兽企业重金招聘Python工程师标准>>> 在使用电脑的时候,很多的用户朋友们都会遇到磁盘爆满,或者病毒侵入的情况,面对这种情况我们不得不格式化磁盘.那么在Mac中如何通 ...

  3. linux汇编格式化磁盘,如何进行硬盘格式化命令操作【详解】

    导语:玩电脑最想要的就是电脑运行流畅,想点哪里点哪里.可是小编的电脑经常会遇到卡屏.电脑反映速度慢的情况,最终小编将电脑抱到修理师那里,修理师说是电脑上硬盘的内存空间太小,被垃圾文件占领了,解决的办法 ...

  4. linux格式化指定分区命令,linux格式化硬盘(linux格式化分区命令详解)

    磁盘虽然分好区了,但是还不能用,还需要在这每一个分区上格局化,所谓格局化,其实便是安装文件体系,Windows下的文件体系有Fat32.NTFS,CentOS运用的文件体系为ext,之前centOS5 ...

  5. linux系统格式化分区的命令,linux系统格式化分区用哪个命令

    linux系统格式化分区用哪个命令? linux系统格式化分区用fdisk命令. Linux fdisk是一个创建和维护分区表的程序,它兼容DOS类型的分区表.BSD或者SUN类型的磁盘列表. 语法f ...

  6. Linux系统格式化分区用哪个命令,linux系统格式化分区的命令是什么

    linux系统格式化分区的命令是什么 发布时间:2020-04-21 11:19:16 来源:亿速云 阅读:486 作者:小新 本文在介绍关于linux系统格式化分区的命令是什么,重点探讨了其具体步骤 ...

  7. prettier 命令行工具来格式化多个文件

    prettier 命令行工具来格式化多个文件 你可以使用 prettier 命令行工具来格式化多个文件.以下是一个使用命令行批量格式化文件的示例: 安装 prettier 如果你还没有安装 prett ...

  8. linux命令行下如何格式化json并进行各种json处理操作

    有时需要在linux 的命令行下,需要查看json的内容或针对json进行各种操作,本文针对此进行梳理.总结. 在Linux系统下基于python json.tool可以格式化json,使用jq工具可 ...

  9. 1056_linux下使用命令行进行磁盘格式化

    linux下使用命令行进行磁盘格式化 Grey 全部学习汇总: https://github.com/GreyZhang/little_bits_of_linux linux下使用命令行进行磁盘格式化 ...

  10. php文件代码格式化,PHP代码格式化(EditPlus+PHPCB) 支持批量格式化

    DW_CS4居然只会格式化HTML和CSS代码,G来G去也只有PHPCB这一个N久没更新过的经典PHP代码格式工具了,命令行的,用法"phpcb file.php > newfile. ...

最新文章

  1. Oracle 11.2.0.4 x64 RAC扩展存储空间
  2. 宝藏好物gRPCurl
  3. 【软件开发底层知识修炼】十七 快速学习GDB调试四 使用GDB进行函数调用栈的查看
  4. 字节数组转换为图片_每日一课 | Python 3 TypeError:无法将“字节”对象隐式转换为str...
  5. C# Socket 编程详解
  6. php ai库,收藏 | 深度学习框架、AI库、ML库、NLP库、CV库汇总!
  7. linux下python开发工具_Python开发工具 Wing IDE
  8. 小数加分数怎样计算讲解_“分数,小数,百分数 的互化”我这样教学,学生很快就学会了。...
  9. [FFmpeg] 常用命令
  10. Linux之深入理解anaconda使用
  11. Java集合之LinkedHashMap
  12. 自学python要多久-自学Python要学会需要多久?老男孩Python培训班
  13. 1002:A+B 输入输出练习III 分数: 2
  14. java反射机制的实现机制_Java反射机制实践
  15. 计算机组成原理定点源码一位乘,计算机组成原理课程设计-定点原码一位乘法器的设计.doc...
  16. openmv实现二维码识别与串口发送
  17. 三菱q系列plc 和电脑socket_三菱Q系列和WinCC以太网通讯的组态步骤
  18. BurpSuite专业版下载安装教程
  19. 怎么在edge浏览器下载扩展(插件)
  20. 视频flv怎么转换成mp4?

热门文章

  1. 深度学习笔记_基本概念_神经网络中的epoch、batch_size和iteration
  2. karto探秘之open_karto 第四章 --- 回环检测与后端优化
  3. opencv摄像头拍摄视频并保存方法
  4. 深度学习模型在FPGA上的部署
  5. 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。
  6. java 之 插入排序
  7. 边看边练之Django(二)---- Django的URL设置
  8. 【树状数组+离线查询】HDU 3333 Turing Tree
  9. JQuery插件iScroll实现下拉刷新,滚动翻页特效
  10. 【转】Android 平台下使用 i2c-tools