Перейти до основного вмісту
Модуль 10 · Урок 1 із 546/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.

CamelCase, ніколи snake_case

Немає підкреслень у багатослівних назвах:

  • ✅ 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 для ключів.
  • r для *Request/io.Reader, w для Writer/ResponseWriter.
  • err для помилок.
  • ctx для context.Context.
  • Приймачі методів: 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 { ... }

Малі інтерфейси часто мають суфікс -er: Reader, Writer, Stringer, Closer. Це повторює той факт, що вони описують поведінку (в ідеалі один метод).

Назви пакетів

Пакет має одну назву, коротку, усі малі літери, без підкреслення:

  • ✅ 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Завантаження…

Використовуйте структуру Http_Client у HTTPClient (або URL-адресу в URL-адресі) відповідно до конвенції Go sugli acronim.

Завантаження редактора…

Рішення доступне після 3 спроб

вправи#go.m10.l1.e2
Спроби: 0Завантаження…

Inverti la visibilità: rendi Username esportato (maiuscolo) and password private (minuscolo).

Завантаження редактора…

Рішення доступне після 3 спроб

Quiz#go.m10.l1.e3
Готовий

Яке це слово є ідіоматичним у Go для типу "сервер HTTP"?

Go
type ??? struct {}
Варіанти відповідей