📘

Golangでの命名規則におけるベストプラクティス

2021/12/28に公開2

Golangの設計思想

Golangは、「単純さ」と「読みやすさ」を重視している言語です。そのため、ソースコードを保守のために、いくつかの単純な規則を採用しています。

この記事では、GoチュートリアルEffectiveGoを参考にしています。

ファイル名

  • Goは、ソースファイルがすべて小文字で、複数の単語をアンダースコアで区切るという規則に従います。
  • 複合ファイル名は_で区切られます。
  • .」で始まるファイル名 または「_」はgoツールによって無視されます。
  • 接尾辞「_test.go」が付いたファイルは、go testツールによってのみコンパイルおよび実行されます。
$ ls
dataloader.go
dataloader_test.go
callback_api.go
callback_api_test.go

関数とメソッド

キャメルケースを使用します。エクスポートされる関数は大文字で始める必要があります。

functions.go
package functions

//1. エクスポートされておらず、パッケージ内でのみ表示されます
func writeToDB() {
}

//2. エクスポートされ、パッケージ内に表示されます
func WriteToDB() {
}

2の場合、functions.WriteToDB()で呼び出し可能。

定数

定数はすべて大文字を使用し、単語を区切るにはアンダースコアを使用する必要があります。

example.go
const (
	MEMBER = iota
	ADMIN
	ADMIN_MANAGER
)

変数

  • 一般に、比較的単純な(短い)名前を使用します。
  • ソースコード全体で一貫した命名スタイルを使用する必要があります
example.go
u := user.Get()
uid := u.id
  • boolなど変数の型がある場合は、HasIsCan, Allowで始める
example.go
type User struct {
	IsBlocked bool
	CanEdit   bool
}
  • 一文字はインデックスを表します: i, j, k
example.go
for i := 0; i < 10; i++ {
    fmt.Println(i)
}

おわりに

今回の記事では、Goにおける命名規則のベストプラクティスについてまとめました。
皆さんのGoライフの一助となれば幸いです。

様々なライブラリの提供者に感謝しつつ、自分も貢献できるように精進します!
twitterでもGolang・Flutter・GCP開発など情報発信していますので、よかったらフォローしてやってくださいmm
https://twitter.com/kenbu05

参考

https://go.dev/tour/welcome/1
https://go.dev/doc/effective_go
https://dave.cheney.net/practical-go/presentations/qcon-china.html
https://medium.com/@kdnotes/golang-naming-rules-and-conventions-8efeecd23b68

Discussion

ハトンハトン

命名規則に関する記事ありがとうございます!
定数について認識が違っていたのでコメントさせて頂きました。

定数はすべて大文字を使用し、単語を区切るにはアンダースコアを使用する必要があります。

https://medium.com/@kdnotes/golang-naming-rules-and-conventions-8efeecd23b68
上記記事からの引用かと思いますがGoチュートリアルとEffectiveGoにはこのような記述が見当たらないように思えます。

https://github.com/golang/go/search?l=Go&p=1&q=const
また、現状のgoのrepositoryを見ても定数に関する明確なルールはないように思えます。

なので、定数の命名は比較的自由につけて良い印象でした。
もし、定数に関してGo公式の記述がありましたら引用元教えて頂ければ幸いです。