使用gofmt格式化代碼

對於一門編程語言來講,代碼格式化是最容易引發爭議的一個問題,不一樣的開發者可能會有不一樣的編碼風格和習慣,可是若是全部開發者都能使用同一種格式來編寫代碼,開發者就能夠將寶貴的時間專一在語言要解決的問題上。html

gofmt介紹

Golang的開發團隊制定了統一的官方代碼風格,而且推出了gofmt工具(gofmt或go fmt)來幫助開發者格式化他們的代碼到統一的風格。gofmt是一個cli程序,會優先讀取標準輸入,若是傳入了文件路徑的話,會格式化這個文件,若是傳入一個目錄,會格式化目錄中全部.go文件,若是不傳參數,會格式化當前目錄下的全部.go文件。git

gofmt默認不對代碼進行簡化,使用-s參數能夠開啓簡化代碼功能,具體來講會進行以下的轉換:github

  • 去除數組、切片、Map初始化時沒必要要的類型聲明:
以下形式的切片表達式:
    []T{T{}, T{}}
將被簡化爲:
    []T{{}, {}}
複製代碼
  • 去除數組切片操做時沒必要要的索引指定
以下形式的切片表達式:
    s[a:len(s)]
將被簡化爲:
    s[a:]
複製代碼
  • 去除迭代時非必要的變量賦值
以下形式的迭代:
    for x, _ = range v {...}
將被簡化爲:
    for x = range v {...}
以下形式的迭代:
    for _ = range v {...}
將被簡化爲:
    for range v {...}
複製代碼

gofmt命令參數列表以下:golang

usage: gofmt [flags] [path ...]
  -cpuprofile string
        write cpu profile to this file
  -d    display diffs instead of rewriting files
  -e    report all errors (not just the first 10 on different lines)
  -l    list files whose formatting differs from gofmt's   -r string         rewrite rule (e.g., 'a[b:len(a)] -> a[b:]')   -s    simplify code   -w    write result to (source) file instead of stdout 複製代碼

能夠看到,gofmt命令還支持自定義的重寫規則,使用-r參數,按照pattern -> replacement的格式傳入規則。編程

有以下內容的Golang程序,存儲在main.go文件中。數組

package main

import "fmt"

func main() {
   a := 1
   b := 2
   c := a + b
   fmt.Println(c)
}
複製代碼

用如下規則來格式化上面的代碼。bash

gofmt -r "a + b -> b + a"
複製代碼

格式化的結果以下。編程語言

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的簡單封裝。ui

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

goland中配置gofmt

Goland是JetBrains公司推出的Go語言IDE,是一款功能強大,使用便捷的產品。

在Goland中,能夠經過添加一個File Watcher來在文件發生變化的時候調用gofmt進行代碼格式化,具體方法是,點擊Preferences -> Tools -> File Watchers,點加號添加一個go fmt模版,Goland中預置的go fmt模版使用的是go fmt命令,將其替換爲gofmt,而後在參數中增長-l -w -s參數,啓用代碼簡化功能。添加配置後,保存源碼時,goland就會執行代碼格式化了。

參考文章

golang.org/cmd/gofmt/

golang.org/doc/effecti…

openhome.cc/Gossip/Go/g…

github.com/hyper0x/go_…

點擊關注知乎專欄Golang私房菜

相關文章
相關標籤/搜索