よりクリーンな一貫性のあるコードのために Go ソースをフォーマットする方法

よりクリーンな一貫性のあるコードのために Go ソースをフォーマットする方法

コードをフォーマットすることは、読みやすさ、一貫性、および再利用性を高める重要な方法です。適切にフォーマットされたコードは、理解、変更、保守が容易になります。

Go の優れた機能の 1 つは、明確に定義された書式設定規則です。組み込みの format パッケージと go fmt コマンドを使用して、コードを自動的にフォーマットできます。これにより、他の Go プログラマーができるだけ簡単に読むことができるようになります。

Format パッケージと fmt コマンド

formatパッケージは、Go ソース コードの標準フォーマットを実装します。このパッケージはgo formatコマンド ライン ツールと相互運用できるため、Go コードを柔軟にフォーマットできます。

format パッケージは go パッケージのサブモジュールです。インポートする方法は次のとおりです。

import "go/format"

fmtコマンドの前にhelpコマンドを指定すると、go fmt コマンドのドキュメントを参照できます。

go help fmt

fmt コマンドの後にファイル名を指定して、そのファイルをフォーマットします。これにより、コードの空白とインデントが Go 標準に準拠するように調整されます。

go fmt main.go

舞台裏では、 go fmt は gofmt コマンドのエイリアスです。具体的には:

gofmt -l -w

これらのフラグにより​​、gofmt は、提供された各ファイルに変更を書き込み、変更されたファイルの名前を一覧表示します。

-xフラグを fmt コマンドに追加できます。-x フラグは、フォーマッターから元のファイルに変更を書き込むのに役立ちます。

go fmt -x main.go

-nフラグは-x と同様に機能しますが、変更は行いません。代わりに、-n なしで fmt が実行するコマンドを表示します。

go fmt -n main.go

フラグはフォーマッタに変更を表示するように指示します。これにより、変更を適用する前に最初に確認することができます。

以下は、0 から 5 までの整数をループして文字列「Hello World!」を出力する単純な Go プログラムです。

// formatting a file named main.go as shown in the example above

package main
import "fmt"
func main() {
  var x int=5
  for i:=0;i<x;i++{
    fmt.Println("Hello World!")
  }
}

Go ソースコードのフォーマット

format パッケージには、プログラムから Go ファイルをフォーマットするためのSource関数が含まれています。ファイルを読み取り、内容を引数として Source 関数に渡す必要があります。

Source 関数は、ファイルまたは新しいファイルに書き込むことができるフォーマットされたファイル コンテンツを返します。

ioutilパッケージのReadFile関数でファイルを読み取ることができます。ReadFile 関数はファイル名を受け取り、処理のためにファイルの内容とエラーを返します。

fileContent, err: = ioutil.ReadFile("main.go")

if err! = nil {
  log.Fatalln("There was an error reading the file", err)
}

ファイルの内容を Source 関数に渡すと、フォーマットされたファイルの内容と処理のためのエラーが返されます。

formatted, err: = format.Source(fileContent)

if err! = nil {
  log.Fatalln("There was a formatting error with the source function", err)
}

ioutilパッケージのWriteFile関数を使用して、フォーマットされたファイルの内容をファイルに書き込むことができます。WriteFile 関数は、ファイル名、内容、およびファイル許可モードを受け取り、エラーを返します。アクセス許可モードは、ファイルが存在しない場合にのみ関連します。その場合、WriteFile によって作成されます。

0644ファイル許可モードでは、次のようになります。

  • ファイル所有者の読み取りおよび書き込み権限。
  • 所有者と同じグループ内の他のユーザーへの読み取りアクセス許可。
  • 他のユーザーへのアクセス許可はありません。

err = ioutil.WriteFile("main.go", formatted, 0644)

if err! = nil {
  log.Fatalln("There was an error writing the file", err)
}

または、書式設定のために Go ソース コードを Source 関数に渡すこともできます。ティック ( ` )を使用して、バイト スライスでコードを指定できます。

package main

import (
  "fmt"
  "go/format"
)

func main() {
  // simple program that calculates the area of a triangle with the math
  // function
  formatted, err: = format.Source([]byte(`
package main
import(
  "fmt"
  "math"
)
func main(){
var a float64=3
var b float64=4
var c float64=5
var s float64=(a+b+c)/2
var area float64=math.Sqrt(s*(s-a)*(s-b)*(s-c))
fmt.Println("The area of the triangle is: ",area)
}
`))

  if err! = nil {
    log.Fatalln("There was a formatting error with the source function", err)
  } else {
    fmt.Println(string(formatted))
  }
}

書式設定では、文字列関数を使用してバイト スライスを文字列に変換する必要があります。これがフォーマットされたソースコードです。

フォーマット操作の結果

フォーマット プロセスのカスタマイズ

format パッケージのConfig構造体を使用して、フォーマット プロセスをカスタマイズできます。Config 構造体には、インスタンス化時にフォーマット オプションを指定できるフィールドが含まれています。

import "go/format"

config: = &format.Config{
  // Tabwidth sets the number of spaces per tab.
  Tabwidth: 8,

  // UseTabs indicates whether the formatter should use tabs instead of
  // spaces.
  UseTabs: false,

  // TabIndent is used to determine if the initial indentation should be
  // done using tabs or spaces.
  TabIndent: true,

  // NoFinalTab specifies whether a final tab should be removed from
  // lines before they are formatted.
  NoFinalTab: true,

  // Spaces specifies whether spaces should be used for alignment.
  Spaces: true,

  // NoTrimTrailingSpace specifies whether trailing white space should
  // be trimmed from lines before they are formatted.
  NoTrimTrailingSpace: false,
}

フィールドを使用して、要件に基づいてオプションを設定することにより、フォーマッターの動作をカスタマイズできます。

次に、この構造体の Source メソッドを使用して、構成に基づいてバイト スライスをフォーマットできます。

func main() {
  fileContent, err: = ioutil.ReadFile("main.go")

  // note that this is a Source method of the `config` type, not from the
  // `format` package itself although the functionality is the same, you'll
  // need to adhere to this if you need to configure the formatter
  formatted, err: = config.Source(fileContent)

  if err! = nil {
    log.Fatalln("There was a formatting error with the config type", err)
  }

  ioutil.WriteFile("main.go", formatted, 0644)
}

このように config.Source() 関数を呼び出すと、構成オプションを使用してmain.goファイルの内容がフォーマットされます。フォーマットされた内容をバイト スライスとエラーとして返します。

Go で文字列をフォーマットおよび操作できます

format パッケージと go fmt コマンドは、コードのフォーマット プロセスを自動化するのに役立ちます。

Go は、文字列フォーマット用の fmt パッケージと、文字列操作用の string パッケージも提供します。

fmt パッケージは、C の printf および scanf 関数に類似した関数を使用して、より単純な形式の I/O を実装します。文字列関数は、UTF-8 でエンコードされた文字列を操作する単純な関数を実装します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です