メインコンテンツにスキップ
モジュール 10 · レッスン 1 / 5コース内の 46/50~10 min
モジュールのレッスン (1/5)

命名規則とスタイル

Go には 強力で交渉不可能な命名規則とスタイル規則があります。公式フォーマッタ gofmt (およびそのスーパーセット goimports) がインデント、スペース、インポート順序を決定します。スタイルについて議論することはトピックから外れたものとみなされます。gofmt -w を実行して次に進みます。これにより、より興味深い問題のためにエネルギーが解放されます。

可視性: 大文字または小文字

public/private キーワードはありません。 名前の最初の文字 によって可視性が決まります。

  • 大文字 → パッケージの外にエクスポートされます (User、Login、MaxRetries)。
  • 小文字 → パッケージに対してプライベート (user、parseLine、defaultTimeout)。

これは、型、関数、メソッド、変数、定数、構造体フィールドに適用されます。

Go
type User struct {
    Name  string  // exported
    email string  // private to the package
}

「プライベート」構造体フィールドは、encoding/json (モジュール 8 を参照) によってシリアル化されず**、pkg_test のテストからアクセスできません。

キャメルケース、決してスネークケースではない

複数の単語の名前にはアンダースコアは使用できません。

  • ✅ HTTPClient、userName、parseRequest
  • ❌ Http_Client、user_name、parse_request

頭字語はすべて大文字 (プライベート スコープ内の場合はすべて小文字):

  • ✅ URL、ID、HTML、JSON、parseURL、userID
  • ❌ Url、Id、Html、Json、parseUrl、userId
Go
type APIResponse struct {
    UserID  int
    HTMLURL string
}

短いスコープの短い名前

Go スタイルは、狭い範囲で 同等の明快さを優先します。

Go
// idiomatic
for i, v := range items { ... }
for k, v := range m { ... }

if err := f(); err != nil { ... }

func (s *Server) Serve(w http.ResponseWriter, r *http.Request) { ... }

確立された規則:

  • i, j, k ループ インデックスの場合。
  • 値の場合は v、キーの場合は k。
  • *Request/io.Reader の場合は r、Writer/ResponseWriter の場合は w。
  • エラーの場合は err。
  • context.Context の場合は ctx。
  • メソッド レシーバー: 型全体にわたって 1 ~ 2 個の一貫した文字 (s *Server、u *User)。 this や self は決して行わないでください。

範囲が広いほど、名前はよりわかりやすいものにする必要があります。ローカルの count は問題ありませんが、エクスポートされた Count 変数は、それが何を意味するのかを示す必要があります。

インターフェイスに「I」プレフィックス、「Impl」サフィックスはありません

Go
// idiomatic
type Reader interface { ... }
type fileReader struct { ... } // concrete implementation

// not idiomatic
type IReader interface { ... }
type ReaderImpl struct { ... }

小規模なインターフェイスには、Reader、Writer、Stringer、Closer という -er という接尾辞が付けられることがよくあります。これは、動作 (理想的には単一のメソッド) を記述しているという事実を反映しています。

パッケージ名

パッケージには 単一の名前、短く、すべて小文字、アンダースコアなし:

  • ✅ bytes、http、os、userauth
  • ❌ userAuth、user_auth、UserAuth

パッケージ名は、そのシンボルの 使用プレフィックス です: bytes.Buffer、http.Client。したがって、user.User は冗長です。型 (user.Account) またはパッケージの名前を変更することをお勧めします。

gofmt は議論の対象ではありません

gofmt は以下を強制します:

  • タブ (スペースではない) によるインデント。
  • 署名と同じ行で { を括弧で囲みます。
  • 空白行で区切られたグループでインポートします。 goimports は、不足しているインポートも追加します。
  • 演算子の周囲のスペース。

コミットする前に必ず実行してください。

Bash
go fmt ./...
goimports -w .
go vet ./...

リンター (staticcheck、golangci-lint) は追加のルール (未使用の変数、シャドウイング、無駄な比較など) を追加します。

演習

運動#go.m10.l1.e1
試行回数: 0読み込み中…

HTTPClient の Http_Client 構造体 (URL 内の Url を指定) は、次のように変換します。

エディターを読み込み中…

3 回の試行後に解決策が利用可能になります

運動#go.m10.l1.e2
試行回数: 0読み込み中…

表示を反転: ユーザー名 esportato (maiuscolo) とパスワード privato (minuscolo) を設定します。

エディターを読み込み中…

3 回の試行後に解決策が利用可能になります

Quiz#go.m10.l1.e3
準備完了

「サーバー HTTP」に関する Go の慣用句は何ですか?

Go
type ??? struct {}
回答の選択肢