Salt la conținutul principal
Modulul 10 · Lecția 1 din 546/50 în curs~10 min
Lecții din modul (1/5)

Convenții de denumire și stil

Go are convenții de denumire și stil puternice și nenegociabile: formatatorul oficial gofmt (și supersetul său goimports) decide indentarea, spațierea și ordinea de import. Stilul de discuție este considerat în afara subiectului: rulezi gofmt -w și mergi mai departe. Acest lucru eliberează energie pentru probleme mai interesante.

Vizibilitate: litere mari sau mici

Nu există cuvinte cheie public/private. prima literă a numelui determină vizibilitatea:

  • Majuscule → exportat în afara pachetului (User, Login, MaxRetries).
  • Minuscule → privat la pachet (user, parseLine, defaultTimeout).

Acest lucru se aplică la: tipuri, funcții, metode, variabile, constante, câmpuri struct.

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

Un câmp structura „privat” nu este serializat de encoding/json (vezi Modulul 8) și nu este accesibil din testele din pkg_test.

CamelCase, niciodată snake_case

Fără liniuțe de subliniere în numele cu mai multe cuvinte:

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

Acronimele sunt toate litere mari (sau toate litere mici, dacă sunt în domeniu privat):

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

Nume scurte pentru domenii scurte

Stilul Go favorizează concizia la o claritate egală în domenii înguste:

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) { ... }

Convenții stabilite:

  • i, j, k pentru indici de buclă.
  • v pentru valori, k pentru chei.
  • r pentru *Request/io.Reader, w pentru Writer/ResponseWriter.
  • err pentru erori.
  • ctx pentru context.Context.
  • Receptorii metodei: 1–2 litere consecvente în întregul tip (s *Server, u *User). Niciodată this sau self.

Cu cât domeniul de aplicare este mai larg, cu atât numele trebuie să devină mai descriptiv: un count local este bine, dar o variabilă Count exportată ar trebui să vă spună ce contează.

Fără prefix „I” pe interfețe, fără sufix „Impl”.

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

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

Interfețele mici au adesea sufixul -er: Reader, Writer, Stringer, Closer. Este ecou cu faptul că descriu un comportament (o singură metodă, în mod ideal).

Numele pachetelor

Un pachet are un singur nume, scurt, toate litere mici, fără caractere de subliniere:

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

Numele pachetului este prefixul de utilizare al simbolurilor sale: bytes.Buffer, http.Client. Deci user.User este redundant: mai bine redenumiți tipul (user.Account) sau pachetul.

gofmt nu este dezbătut

gofmt impune:

  • Indentare cu file (nu spații).
  • Acola { pe aceeași linie cu semnătura.
  • Importuri în grupuri separate printr-o linie goală; goimports adaugă și importurile lipsă.
  • Spații în jurul operatorilor.

Alergați întotdeauna înainte de a comite:

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

Linters (staticcheck, golangci-lint) adaugă reguli suplimentare (variabile neutilizate, umbrire, comparații inutile, ...).

Exerciții

Exercițiu#go.m10.l1.e1
Încercări: 0Se încarcă…

Numiți structura Http_Client în HTTPClient (în câmpul Url în URL) urmând convențiile Go sugli acronimi.

Se încarcă editorul...

Soluție disponibilă după 3 încercări

Exercițiu#go.m10.l1.e2
Încercări: 0Se încarcă…

Inversează vizibilitatea: rendi Nume de utilizator esportat (maiuscolo) și parola privată (minuscolo).

Se încarcă editorul...

Soluție disponibilă după 3 încercări

Quiz#go.m10.l1.e3
Gata

Care sunt aceste nume sunt idiomatice în Go per un tip esportat 'server HTTP'?

Go
type ??? struct {}
Opțiuni de răspuns