Модульні уроки (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.
CamelCase, ніколи snake_case
Немає підкреслень у багатослівних назвах:
- ✅
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для ключів.rдля*Request/io.Reader,wдляWriter/ResponseWriter.errдля помилок.ctxдляcontext.Context.- Приймачі методів: 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 { ... }Малі інтерфейси часто мають суфікс -er: Reader, Writer, Stringer, Closer. Це повторює той факт, що вони описують поведінку (в ідеалі один метод).
Назви пакетів
Пакет має одну назву, коротку, усі малі літери, без підкреслення:
- ✅
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) додають додаткові правила (невикористані змінні, затінення, марні порівняння, ...).
вправи
Використовуйте структуру Http_Client у HTTPClient (або URL-адресу в URL-адресі) відповідно до конвенції Go sugli acronim.
Рішення доступне після 3 спроб
Inverti la visibilità: rendi Username esportato (maiuscolo) and password private (minuscolo).
Рішення доступне після 3 спроб
Яке це слово є ідіоматичним у Go для типу "сервер HTTP"?
type ??? struct {}