您的位置 首页 golang

清华学神尹成带你学习golang2021(52)

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

    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。

文章来源:智云一二三科技

文章标题:清华学神尹成带你学习golang2021(52)

文章地址:https://www.zhihuclub.com/98375.shtml

关于作者: 智云科技

热门文章

网站地图