我的编程空间,编程开发者的网络收藏夹
学习永远不晚

go fmt命令有什么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

go fmt命令有什么用

本篇内容介绍了“go fmt命令有什么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

在go语言中,“go fmt”命令主要是用来帮开发者格式化所写好的代码文件。“go fmt”命令会按照Go语言代码规范格式化指定代码包中的所有Go语言源码文件的代码,所有Go语言源码文件即包括命令源码文件、库源码文件和测试源码文件。“go fmt”命令只会格式化被直接保存在指定代码包对应目录下的Go语言源码文件。

go fmt命令介绍

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

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

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

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

go fmt命令有什么用

go fmt命令主要是用来帮你格式化所写好的代码文件【很多第三方集成软件都是使用了go fmt命令】

使用:

go fmt <文件名>.go

使用go fmt命令,更多时候是用gofmt,而且需要参数-w,否则格式化结果不会写入文件。gofmt -w class="lazy" data-src,可以格式化整个项目。

参数介绍

  • -l 显示那些需要格式化的文件

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

  • -r 添加形如“a[b:len(a)] -> a[b:]”的重写规则,方便我们做批量替换

  • -s 简化文件中的代码

  • -d 显示格式化前后的diff而不是写入文件,默认是false

  • -e 打印所有的语法错误到标准输出。如果不使用此标记,则只会打印不同行的前10个错误。

  • -cpuprofile 支持调试模式,写入相应的cpufile到指定的文件 作用区域

go fmt与gofmt

go fmt命令会按照Go语言代码规范格式化指定代码包中的所有Go语言源码文件的代码,所有Go语言源码文件即包括命令源码文件、库源码文件和测试源码文件。注意,当代码包还有子代码包时,子代码包中的Go语言源码文件是不包含在内的。也就是说,go fmt命令只会格式化被直接保存在指定代码包对应目录下的Go语言源码文件。

与go doc命令和godoc命令的关系类似,go fmt命令是gofmt命令的简单封装。go fmt命令本身可以接受两个标记。标记-n可以让命令程序仅打印出内部使用的gofmt命令及其标记和参数而不真正执行它。标记-x则会使命令程序既打印又执行这个命令。在go fmt命令程序内部,会在其调用的gofmt命令后面加上标记-l和-w,并以指定代码包中的所有Go语言源码文件的路径作为参数,就像这样:

hc@ubt:~$ go fmt -n pkgtoolgofmt -l -w golang/goc2p/class="lazy" data-src/pkgtool/envir.go golang/goc2p/class="lazy" data-src pkgtoolenvir_test.go golang/goc2p/class="lazy" data-src/pkgtool/fpath.go golang/goc2p/class="lazy" data-src/pkgtool ipath.go golang/goc2p/class="lazy" data-src/pkgtool/pnode.go golang/goc2p/class="lazy" data-src/pkgtool/util.go golang/goc2p/class="lazy" data-src/pkgtool/util_test.go

注意,作为gofmt命令参数的Go语言源码文件的路径是相对的,而不是绝对的。不过这只是为了让参数看起来更短一些而已。所以,当我们直接执行gofmt命令的时候,使用源码文件的绝对路径作为参数也是没有问题的。实际上,任何Go源码文件或包含有Go语言源码文件的目录的相对路径或绝对路径都可以作为gofmt命令的参数。当使用包含有Go语言源码文件的目录的绝对路径或相对路径作为参数时,gofmt命令会把在这个目录下的Go语言源码文件作为目标源码文件。

go fmt命令程序内部在执行gofmt命令时加入的标记是固定的。如果我们想使用与之不同的标记集合就必须直接使用gofmt命令了。现在我们来看一下gofmt命令可接受的所有标记。如下表。

表0-13 gofmt命令的标记说明

标记名称标记描述
-cpuprofile把CPU概要写入指定文件。文件的路径应该作为此标记的值。
-d显示格式化前后的不同(如果有的话),而不是直接格式化那些代码。
-e报告目标源码文件中的所有错误。默认情况下,仅会显示前10个错误。
-l仅把那些不符合格式化规范的、需要被命令程序改写的源码文件的绝对路径打印到标准输出。而不是把改写后的全部内容都打印到标准输出。
-r添加形如“a[b:len(a)] -> a[b:]”的重写规则。如果我们需要自定义某些额外的格式化规则,就需要用到它。规则字符串应该作为此标记的值。
-s简化文件中的代码。
-w把改写后的内容直接写入到文件中,而不是作为结果打印到标准输出。

看过上表中的信息,我们就很容易理解go fmt命令的行为了。因为它在内部执行了gofmt命令,并加入了标记-l和-w。这会使命令程序打印需要改写的文件的绝对路径到标准输出,并且直接把格式化后的内容写入到原始文件中。在默认情况下,gofmt命令会把格式化后的内容直接打印到标准输出上。

实际上,命令程序会把目标源码文件中的内容解析成抽象语法树。当在解析过程中发现语法错误时,命令程序就会显示错误提示信息并退出。在默认情况下,目标源码文件中的语法错误不会全部被显示出来。我们可以加入标记-e以使命令程序打印出全部错误到标准输出。

自定义改写操作

在默认情况下,gofmt命令对Go语言源码文件的改写操作包括如下几个方面:

  • 以字典序排序依赖包导入语句块中代码包导入路径的先后顺序。

  • 标准化各个语言或语句块之间的缩进、空格和换行。比如,把所有的\r\n转换成\n。

  • 对代码语法的小修正。比如,消除用于判断变量类型的switch语句块中多余的圆括号。

如果想自定义额外的改写操作,需要使用-r标记。-r标记的值中必须包含“->”,比如a[b:len(a)] -> a[b:]。“->”的左边应该是需要被替代的表达式的示例,而右边则应该是用来替代“->”左边表达式的表达式的示例。

如果我们使用标记-r,那么命令程序在解析源码文件之前会将此标记值中的被替换表达式和替换表达式分别解析为抽象语法树的表达式节点。如果解析不成功,也就意味着无法进行后续的替换操作,命令程序会在打印错误提示信息后退出。如果解析成功,那么命令程序会在解析源码文件成功之后进行表达式替换操作。命令程序会寻找该源码文件的抽象语法树中与被替换表达式相匹配的节点,并用替换表达式替换之。gofmt命令已支持但不限于如下自定义替换操作:

  • 程序实体名称的替换。程序实体包括变量、常量、函数、结构体和接口。比如:-r=array1->array2和-r=FuncA->FuncB。

  • 程序实体类型的替换,其中也包含函数的参数和结果的类型的替换。比如:-r=string->bool和-r=interface{}->int。

  • 多余圆括号的清除。比如:我们这样设置标记-r=(x)->x会使目标代码中的a = (-x.s)被改写为a = -x.s,也会使代码中的((b = -x.f()))被改写为b = -x.f(),还会使c = -(x).f改写为c = -x.f,但是不会去掉d = (&x).s和e = (-x).f()中的圆括号。也就是说,命令程序会在不改变语义和不产生语法歧义的前提下清除代码中多余的圆括号。

  • 数值操作的替换。比如:我们这样设置标记-r=x+x->x*2会使代目标码中的所有的x + x被替换为x * 2。并且,如果需要被替换的表达式中包含注释的话,则在替换操作的过程中会去掉这些注释。比如,在同样的标记设置的情况下x + x仍然会被替换为x * 2。

  • 基于参数列表的函数调用替换。比如:如果我们这样设置标记-r='funcA(a)->FuncA(a, c)',则目标代码中调用函数funcA并以一个变量作为参数的语句都会被替换为调用函数FuncA并以变量a和变量c作为参数的语句。注意,被替换表达式中作为参数的a只是表明函数funcA有一个参数,而并不关心这个参数的名称是什么。也就是说,在同样的标记设置的情况下,目标代码中的funcA(b)或funcA(x)都会被替换为FuncA(a, c)。再或者,如果我们这样设置标记-r='funB(x...)->FunC(x)',则目标代码中的funB(x...)或funB(y...)或其它类似的调用函数都会被替换为FunC(x)。其中,当类型为数组/切片的参数后跟三个英文半角句号“…”时,则表明需要把这个参数中的每一个元素都作为单独的参数传入到函数中。因此,这种替换方式可以用来在函数名称和/或参数列表改变之后,批量的跟进修正调用该函数的代码。

代码简化操作

当我们在执行gofmt命令时加入了标记-s,命令程序会在目标源码文件中寻找可以简化的代码并简化它。简化操作包括:

  • 消除在数组/切片初始化中的不必要的类型声明。

  • 消除在字典初始化中的不必要的类型声明。

  • 消除在数组/切片切片操作时不必要的索引指定。

  • 消除迭代时的非必要临时变量赋值操作。

这些操作基本上都是出于尽量使用Go语言的语法糖已达到减少代码量的目的。我们在编写Go语言代码的时候应该直接使用这些语法糖而不应该依赖使用gofmt命令来简化。这里所说的Go语言的语法糖,我们在第3章中已经有所介绍。

我们在本小节中详细介绍了go fmt命令和gofmt命令。下面我们再汇总一下这两个命令可以为我们做的事情。如下表。

表0-14 go fmt命令和gofmt命令的功能

功能go fmt命令gofmt命令
格式化代码
列出不规范的源码文件
自动改写源码文件
显示对比信息×
提示全部错误×
简化代码×
自定义替换/重构辅助×
CPU概要记录×

最后,值得一提的是,当我们执行gofmt命令且没有加任何参数的时候,该命令将会进入到交互模式。在这种模式下,我们可以直接在命令行界面中输入源码,并以Ctrl-d结束。在Linux操作系统下,Ctrl-d代表EOF(End Of File,中文译为文件结束符)。需要注意的是,如果在一行的中间按下Ctrl-d,则表示输出“标准输入”的缓存区,所以这时必须连续按两次Ctrl-d。另外,在Windows操作系统下,Ctrl-z代表EOF,所以需要以Ctrl-z结束。在这之后,gofmt命令会像从源码文件中读取源码那样从命令行界面(也称为标准输入)读取源码,并在格式化后将结果打印到命令行界面(也称为标准输出)中。示例如下:

hc@ubt:~$ gofmt -r='fmt.Println(a)->fmt.Printf("%s\n", a)'if a=="print" {fmt.Println(a)}                            <----- 在此行的末尾键入回车和Ctrl-d。warning: rewrite ignored for incomplete programs          <----- 此行及以下就是命令输出的内容。if a == "print" {        fmt.Println(a)}

由上述示例可知,我们可以使用gofmt命令的交互模式格式化任意的代码片段。虽然会显示一行警告信息,但是格式化后的结果仍然会被打印出来。并且,在交互模式下,当我们输入的代码片段不符合Go语言的语法规则时,命令程序也会打印出错误提示信息。在其它方面,命令程序在交互模式与普通模式下的行为也是基本一致的。

“go fmt命令有什么用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

go fmt命令有什么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

go fmt命令有什么用

本篇内容介绍了“go fmt命令有什么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在go语言中,“go fmt”命令主要是用来帮开发者格
2023-07-05

Linux的fmt命令有什么作用

这篇文章主要介绍了Linux的fmt命令有什么作用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux的fmt命令有什么作用文章都会有所收获,下面我们一起来看看吧。Linux长常用命令fmt 读取文件的内容
2023-06-28

Go语言中go fmt命令怎么用

这篇文章主要为大家展示了“Go语言中go fmt命令怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Go语言中go fmt命令怎么用”这篇文章吧。go fmt命令主要是用来帮你格式化所写好的
2023-06-25

Linux常用命令fmt怎么用

这篇文章给大家分享的是有关Linux常用命令fmt怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Linux常用命令fmt命令用于编排文本文件,fmt指令会从指定的文件里读取内容,将其依照指定格式重新编排后,
2023-06-28

go install命令有什么用

“go install”命令用于编译并安装指定的代码包及它们的依赖包;当指定的代码包的依赖包还没有被编译和安装时,该命令会先去处理依赖包。“go install”命令会将编译的中间文件放在GOPATH的pkg目录下,以及固定地将编译结果放在GOPATH的bin目录下。
2023-05-14

go get命令有什么用

“go get”命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装。“go get”命令可以动态获取远程代码包,在使用“go get”命令前,需要安装与远程包匹配的代码管理工具,如Git、SVN、HG等,参数中需要提供一个包名。
2023-05-14

gofmt 和 go fmt 有什么区别?

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《gofmt 和 go fmt 有什么区别?》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!问题内容我看到有 gofmt 和 go
gofmt 和 go fmt 有什么区别?
2024-04-05

Linux基础命令fmt的用法

这篇文章主要介绍“Linux基础命令fmt的用法”,在日常操作中,相信很多人在Linux基础命令fmt的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux基础命令fmt的用法”的疑惑有所帮助!接下来
2023-06-05

go test命令有什么作用

这篇文章主要介绍“go test命令有什么作用”,在日常操作中,相信很多人在go test命令有什么作用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go test命令有什么作用”的疑惑有所帮助!接下来,请跟
2023-07-05

Linux中fmt命令如何使用

今天就跟大家聊聊有关Linux中fmt命令如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Linux fmt 命令fmt 命令是一个简单的文本格式化工具,任何人都能在命令行下运
2023-06-16

Linux命令中的cat命令有什么用

今天给大家介绍一下Linux命令中的cat命令有什么用。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。cat命令的用途是连接文件或标准输入并打印。这个命令常用来
2023-06-28

go get命令的作用是什么

今天小编给大家分享一下go get命令的作用是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。“go get”命令可以借助
2023-07-05

go install命令的作用是什么

这篇文章主要介绍“go install命令的作用是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go install命令的作用是什么”文章能帮助大家解决问题。“go install”命令用于编译
2023-07-05

ubuntu chmod命令有什么用

chmod命令用于修改文件或目录的权限。具体来说,chmod命令可以用于修改文件或目录的读、写和执行权限。通过设置不同的权限组合,可以控制用户对文件或目录的访问权限。常用的权限符号包括:- r(读取权限)- w(写入权限)- x(执行权限)
2023-08-31

Linux tee命令有什么用

这篇文章主要介绍Linux tee命令有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单的说就是把数据重定向到
2023-06-27

Linux ifcfg命令有什么用

本篇内容介绍了“Linux ifcfg命令有什么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Linux常用命令ifcfg命令 是一个Ba
2023-06-28

Linux ps命令有什么用

这篇文章跟大家分析一下“Linux ps命令有什么用”。内容详细易懂,对“Linux ps命令有什么用”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“Linux ps命令有什么用”
2023-06-28

Linux有什么常用命令

这篇文章主要为大家展示了“Linux有什么常用命令”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux有什么常用命令”这篇文章吧。ls最高使用频率的命令之一。命令格式: ls [OPTION
2023-06-15

Linux ftpshut命令有什么用

这篇“Linux ftpshut命令有什么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux ftpshut命令有什
2023-06-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录