ホームページ  >  記事  >  バックエンド開発  >  go fmt コマンドの機能は何ですか

go fmt コマンドの機能は何ですか

青灯夜游
青灯夜游オリジナル
2023-01-28 11:42:371800ブラウズ

go 言語では、「go fmt」コマンドは主に、開発者が作成したコード ファイルのフォーマットを支援するために使用されます。 "go fmt" コマンドは、Go 言語コード仕様に従って、指定されたコード パッケージ内のすべての Go 言語ソース コード ファイルのコードをフォーマットします。すべての Go 言語ソース コード ファイルには、コマンド ソース コード ファイル、ライブラリ ソース コード ファイル、およびテスト ソース コードが含まれますファイル。 「go fmt」コマンドは、指定されたコード パッケージに対応するディレクトリに直接保存されている Go 言語ソース コード ファイルのみをフォーマットします。

go fmt コマンドの機能は何ですか

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

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 src を使用すると、プロジェクト全体をフォーマットできます。

パラメータの紹介

  • -l フォーマットが必要なファイルを表示します

  • -w Put 書き換えられた内容は、結果として標準出力に出力されるのではなく、ファイルに直接書き込まれます。

  • #-r バッチ置換を容易にするために、「a[b:len(a)] -> a[b:]」の形式で書き換えルールを追加します

  • -s ファイル内のコードを簡略化します

  • -d ファイルに書き込む代わりに、フォーマット前後の差分を表示します。デフォルトは 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 コマンド自体は 2 つのタグを受け入れることができます。 -n フラグを使用すると、コマンド プログラムは実際に実行せずに、内部で使用される gofmt コマンドとそのフラグおよび引数を出力するだけで済みます。 -x フラグを指定すると、コマンド プログラムはコマンドの出力と実行の両方を実行します。 go fmt コマンド プログラム内では、呼び出した gofmt コマンドの後にマーカー -l と -w が追加され、次のように、指定されたコード パッケージ内のすべての Go 言語ソース ファイルのパスがパラメーターとして使用されます。
hc@ubt:~$ go fmt -n pkgtool
gofmt -l -w golang/goc2p/src/pkgtool/envir.go golang/goc2p/src pkgtoolenvir_test.go golang/goc2p/src/pkgtool/fpath.go golang/goc2p/src/pkgtool ipath.go golang/goc2p/src/pkgtool/pnode.go golang/goc2p/src/pkgtool/util.go golang/goc2p/src/pkgtool/util_test.go

gofmt コマンドのパラメータとしての Go 言語ソース ファイルへのパスは絶対パスではなく相対パスであることに注意してください。ただし、これはパラメータを短く見せるためだけです。したがって、 gofmt コマンドを直接実行する場合は、ソースコードファイルの絶対パスをパラメータとして使用しても問題ありません。実際、Go ソース コード ファイルまたは Go 言語ソース コード ファイルを含むディレクトリの相対パスまたは絶対パスは、gofmt コマンドのパラメータとして使用できます。 gofmt コマンドは、Go 言語のソースコードファイルが含まれるディレクトリの絶対パスまたは相対パスをパラメータとして指定した場合、そのディレクトリ内の Go 言語のソースコードファイルをターゲットソースコードファイルとして使用します。

gofmt コマンド実行時に go fmt コマンドプログラム内に追加されるタグが修正されました。別のタグのセットを使用したい場合は、 gofmt コマンドを直接使用する必要があります。次に、gofmt コマンドで受け入れられるすべてのタグを見てみましょう。以下の表に示すとおりです。

表 0-13 gofmt コマンドのマークの説明

#タグ名タグの説明##-cpuprofile-d-e-l-r-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 を呼び出し、変数をパラメータとして受け取るターゲット コード内のステートメントが置き換えられます。変数 a と変数 c をパラメータとして持つ A ステートメントで関数 FuncA を呼び出すことによって。置換された式のパラメータとしての a は、関数 funcA にパラメータがあることを示すだけであり、パラメータの名前は関係ないことに注意してください。つまり、同じフラグ設定により、ターゲット コード内の funcA(b) または funcA(x) は FuncA(a, c) に置き換えられます。または、このようにフラグ -r='funB(x...)->FunC(x)' を設定すると、funB(x...) または funB(y...) または他の同様の呼び出し関数が実行されます。 FunC(x) に置き換えられます。このうち、配列/スライス型のパラメータの後に英語の半角ピリオド「...」が 3 つ続く場合、このパラメータの各要素を個別のパラメータとして関数に渡す必要があることを示します。したがって、この置換方法を使用すると、関数名やパラメーター リストが変更された後、関数を呼び出すコードを一括で追跡および修正することができます。

コードの簡略化操作

gofmt コマンドの実行時にフラグ -s を追加すると、コマンド プログラムはターゲットのソース コードを検索します。コードを簡略化して単純化します。簡略化には次のものが含まれます。

  • 配列/スライスの初期化で不要な型宣言を削除します。

  • ディクショナリの初期化で不要な型宣言を削除します。

  • 配列/スライスのスライス操作中に不要なインデックスの指定を排除します。

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

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

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

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

CPU を配置します。概要が指定されたファイルに書き込まれます。ファイルへのパスをこのタグの値として使用する必要があります。
コードを直接フォーマットするのではなく、フォーマット前後の違い (存在する場合) を表示します。
ターゲット ソース コード ファイル内のすべてのエラーを報告します。デフォルトでは、最初の 10 個のエラーのみが表示されます。
形式仕様を満たしておらず、コマンド プログラムによって標準出力に書き換える必要があるソース コード ファイルの絶対パスのみを出力します。書き換えられたすべてのコンテンツを標準出力に出力する代わりに。
「a[b:len(a)] -> a[b:]」の形式で書き換えルールを追加します。追加の書式設定ルールをカスタマイズする必要がある場合は、これを使用する必要があります。ルール文字列は、このタグの値として使用する必要があります。
ファイル内のコードを簡略化します。
結果を標準出力に出力するのではなく、書き換えたコンテンツをファイルに直接書き込みます。
功能 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=&#39;fmt.Println(a)->fmt.Printf("%s\n", a)&#39;
if a=="print" {fmt.Println(a)}                            <----- 在此行的末尾键入回车和Ctrl-d。
warning: rewrite ignored for incomplete programs          <----- 此行及以下就是命令输出的内容。
if a == "print" {
        fmt.Println(a)
}

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

【相关推荐:Go视频教程编程教学

以上がgo fmt コマンドの機能は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。