モジュールのレッスン (1/5)
命名規則とスタイル
Go には 強力で交渉不可能な命名規則とスタイル規則があります。公式フォーマッタ gofmt (およびそのスーパーセット goimports) がインデント、スペース、インポート順序を決定します。スタイルについて議論することはトピックから外れたものとみなされます。gofmt -w を実行して次に進みます。これにより、より興味深い問題のためにエネルギーが解放されます。
可視性: 大文字または小文字
public/private キーワードはありません。 名前の最初の文字 によって可視性が決まります。
- 大文字 → パッケージの外にエクスポートされます (
User、Login、MaxRetries)。 - 小文字 → パッケージに対してプライベート (
user、parseLine、defaultTimeout)。
これは、型、関数、メソッド、変数、定数、構造体フィールドに適用されます。
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
type APIResponse struct {
UserID int
HTMLURL string
}短いスコープの短い名前
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」サフィックスはありません
// 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は、不足しているインポートも追加します。 - 演算子の周囲のスペース。
コミットする前に必ず実行してください。
go fmt ./...
goimports -w .
go vet ./...リンター (staticcheck、golangci-lint) は追加のルール (未使用の変数、シャドウイング、無駄な比較など) を追加します。
演習
HTTPClient の Http_Client 構造体 (URL 内の Url を指定) は、次のように変換します。
3 回の試行後に解決策が利用可能になります
表示を反転: ユーザー名 esportato (maiuscolo) とパスワード privato (minuscolo) を設定します。
3 回の試行後に解決策が利用可能になります
「サーバー HTTP」に関する Go の慣用句は何ですか?
type ??? struct {}