名前

名前はGoにおいて他の言語と同じく重要です。場合によっては意味的な効果を持つこともあります。たとえば、名前の最初の文字が大文字かどうかによって、パッケージの外部からその名前が見える(公開される)かどうかが決まります。そのため、Goプログラムでの命名規則について少し時間を割いて説明する価値があります。

パッケージ名

パッケージがインポートされると、パッケージ名がその内容にアクセスするためのアクセサーになります。次のようにした後:

import "bytes"

インポートするパッケージはbytes.Bufferについて話すことができます。そのパッケージを使用するすべての人が同じ名前を使ってその内容を参照できると便利です。これは、パッケージ名が良いものであるべきことを意味します:短く、簡潔で、想起しやすい。慣習として、パッケージには小文字の単一語の名前が付けられます。アンダースコアやmixedCapsは必要ありません。あなたのパッケージを使用するすべての人がその名前を入力することになるため、簡潔性を重視してください。そして、衝突を事前に心配する必要はありません。パッケージ名はインポートのデフォルト名にすぎません。すべてのソースコードで一意である必要はありません。まれに衝突が発生した場合、インポートするパッケージがローカルで使用する別の名前を選択できます。いずれにしても、混乱はまれです。なぜなら、インポートのファイル名がどのパッケージが使用されているかを決定するからです。

もう一つの慣習は、パッケージ名がそのソースディレクトリのベース名であることです。src/encoding/base64にあるパッケージは"encoding/base64"としてインポートされますが、名前はbase64であり、encoding_base64でもencodingBase64でもありません。

パッケージのインポーターは、その名前を使用してその内容を参照するため、パッケージ内のエクスポートされた名前はその事実を利用して繰り返しを避けることができます。(主にテストや他の特殊な状況を意図したimport .記法は使用しないでください)たとえば、bufioパッケージのバッファード・リーダー・タイプはBufReaderではなくReaderと呼ばれます。なぜなら、ユーザーはそれをbufio.Readerとして見るからです。これは明確で簡潔な名前です。さらに、インポートされたエンティティは常にそのパッケージ名でアドレス指定されるため、bufio.Readerio.Readerと競合しません。同様に、ring.Ringの新しいインスタンスを作成する関数(これはGoにおけるコンストラクタの定義です)は通常NewRingと呼ばれますが、Ringがパッケージによってエクスポートされる唯一のタイプであり、パッケージがringと呼ばれるため、単にNewと呼ばれます。パッケージのクライアントはこれをring.Newとして見ます。パッケージ構造を使用して良い名前を選択するのに役立ててください。

別の短い例はonce.Doです。once.Do(setup)は読みやすく、once.DoOrWaitUntilDone(setup)と書いても改善されません。長い名前が自動的に物事をより読みやすくするわけではありません。役に立つdocコメントは、すべての情報を名前に詰め込もうとするよりも、多くの場合価値があります。

Getters

Goは getters や setters の自動サポートを提供していません。gettersやsettersを自分で提供することは何も悪いことではなく、しばしば適切なことですが、getter の名前にGetを付けることは慣用的でも必要でもありません。owner(小文字、非公開)というフィールドがある場合、getterメソッドはGetOwnerではなくOwner(大文字、公開)と呼ばれるべきです。大文字の名前を使用することで、フィールドからメソッドを識別するためのフックを提供します。必要に応じて、setter関数はおそらくSetOwnerと呼ばれるでしょう。どちらの名前も実際によく読めます:

owner := obj.Owner()
if owner != user {
    obj.SetOwner(user)
}

インターフェース名

慣習として、1つのメソッドインターフェースは、メソッド名に-er接尾辞または類似の修飾を付けてエージェント名詞を構成することによって命名されます:ReaderWriterFormatterCloseNotifierなど。

このような名前は数多くあり、それらと、それらが捉える関数名を尊重することは生産的です。ReadWriteCloseFlushStringなどには標準的なシグネチャと意味があります。混乱を避けるため、同じシグネチャと意味を持つ場合でなければ、メソッドにそれらの名前の一つを付けないでください。逆に、あなたのタイプが、よく知られたタイプのメソッドと同じ意味を持つメソッドを実装する場合、同じ名前とシグネチャを付けてください。文字列変換メソッドをToStringではなくStringと呼んでください。

MixedCaps

最後に、Goの慣習は、複数語の名前を書くためにアンダースコアではなくMixedCapsmixedCapsを使用することです。