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.
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
type APIResponse struct {
UserID int
HTMLURL string
}Nume scurte pentru domenii scurte
Stilul Go favorizează concizia la o claritate egală în domenii înguste:
// 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, kpentru indici de buclă.vpentru valori,kpentru chei.rpentru*Request/io.Reader,wpentruWriter/ResponseWriter.errpentru erori.ctxpentrucontext.Context.- Receptorii metodei: 1–2 litere consecvente în întregul tip (
s *Server,u *User). Niciodatăthissauself.
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”.
// 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ă;
goimportsadaugă și importurile lipsă. - Spații în jurul operatorilor.
Alergați întotdeauna înainte de a comite:
go fmt ./...
goimports -w .
go vet ./...Linters (staticcheck, golangci-lint) adaugă reguli suplimentare (variabile neutilizate, umbrire, comparații inutile, ...).
Exerciții
Numiți structura Http_Client în HTTPClient (în câmpul Url în URL) urmând convențiile Go sugli acronimi.
Soluție disponibilă după 3 încercări
Inversează vizibilitatea: rendi Nume de utilizator esportat (maiuscolo) și parola privată (minuscolo).
Soluție disponibilă după 3 încercări
Care sunt aceste nume sunt idiomatice în Go per un tip esportat 'server HTTP'?
type ??? struct {}