go fmt コマンド – コードファイルのフォーマット

go fmt コマンド - コードファイルのフォーマット

 
 
プログラミング言語の場合、コードのフォーマットは最も物議を醸す問題です。開発者によってコーディング スタイルや習慣が異なる場合がありますが、すべての開発者が同じフォーマットを使用してコードを記述することができれば、開発者は言語によって解決される問題に集中できます。したがって、開発時間を節約できます。

 

ゴルフの紹介

Go 言語の開発チームは、統一された公式コード スタイルを策定し、開発者がコードを統一スタイルにフォーマットできるようにする gofmt ツール (gofmt または go fmt) を起動しました。

gofmt は、最初に標準入力を読み取る cli プログラムです。ファイル パスが渡されると、ファイルがフォーマットされます。ディレクトリが渡されると、ディレクトリ内のすべての .go ファイルがフォーマットされます。パラメータが渡されない場合は、現在のディレクトリ内のすべての .go ファイルをフォーマットします。

gofmt はデフォルトではコードを簡素化しません。 -sパラメータを使用してコード簡略化機能を有効にします。具体的には、次の変換が実行されます。

1) 配列、スライス、マップの初期化時に不要な型宣言を削除します。

次の形式のスライス式:

[]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 すべての構文エラーを標準出力に出力します。このフラグを使用しない場合、各行の最初のエラーと最初の 10 個のエラーのみが出力されます。
-command ソースコードファイル内のコメントを保持するかどうか。デフォルトでは、このフラグは true の値で暗黙的に使用されます。
-tabs このフラグは、コード内のインデントに使用されるスペースの数を設定するために使用されます。デフォルト値は 8 です。このフラグを機能させるには、「-tabs」フラグを使用して値を false に設定します。
-tab インデントにスペースの代わりにタブ (‘\t’) を使用するかどうか。デフォルトでは、このフラグは true の値で暗黙的に使用されます。
-cpuprofile CPU 使用率のログを有効にし、ログの内容をこのタグ値が指すファイルに保存するかどうか。

gofmt コマンドはカスタム書き換えルールもサポートしており、 -rパラメーターを使用して、パターン -> 置換の形式でルールを渡していることがわかります。

[例] main.goファイルには、以下の内容のGolangプログラムが格納されています。

 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 はインデントを表すためにタブを使用し、行幅に制限はありません。コードを手動で折り返す場合、gofmt はコードのフォーマットを強制的に 1 行に戻すことはありません。

行って、行って、行ってください

gofmt は独立した cli プログラムであり、gofmt の簡易パッケージである Go 言語のgo fmt go fmtがあります。

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の 2 つだけがあります。

  • -n内部で実行されるgo fmtコマンドのみを出力します。
  • -xコマンドはgo fmtコマンドを出力するだけでなく実行も行いますが、より詳細な設定が必要な場合は gofmt コマンドを直接実行する必要があります。

go fmt gofmt を呼び出すときに-l -wパラメータを追加します。これはgofmt -l -wを実行するのと同じです。

 

「 go fmt コマンド – コードファイルのフォーマット」についてわかりやすく解説!絶対に観るべきベスト2動画

How-to Go: fmt package
【たった1時間で学べる】Go言語のプログラミング初心者向けの超入門講座【文字書き起こし、ソースコードも完全無料!】