Pelajaran modul (1/5)
Konvensi dan gaya penamaan
Go memiliki konvensi penamaan dan gaya yang kuat dan tidak dapat dinegosiasikan: pemformat resmi gofmt (dan supersetnya goimports) menentukan indentasi, spasi, dan urutan impor. Gaya berdiskusi dianggap di luar topik: Anda menjalankan gofmt -w dan melanjutkan. Ini membebaskan energi untuk masalah yang lebih menarik.
Visibilitas: huruf besar atau kecil
Tidak ada public/private kata kunci. Huruf pertama nama menentukan visibilitas:
- Huruf Besar → diekspor ke luar paket (
User,Login,MaxRetries). - Huruf kecil → pribadi untuk paket (
user,parseLine,defaultTimeout).
Hal ini berlaku untuk: tipe, fungsi, metode, variabel, konstanta, bidang struct.
type User struct {
Name string // exported
email string // private to the package
}Bidang struct "pribadi" tidak diserialkan oleh encoding/json (lihat Modul 8), dan tidak dapat diakses dari pengujian di pkg_test.
CamelCase, tidak pernah ular_case
Tidak ada garis bawah pada nama multi-kata:
- ✅
HTTPClient,userName,parseRequest - ❌
Http_Client,user_name,parse_request
Akronim menggunakan huruf besar semua (atau huruf kecil semua, jika dalam lingkup pribadi):
- ✅
URL,ID,HTML,JSON,parseURL,userID - ❌
Url,Id,Html,Json,parseUrl,userId
type APIResponse struct {
UserID int
HTMLURL string
}Nama pendek untuk cakupan pendek
Gaya Go mengutamakan singkatnya dengan kejelasan yang sama dalam cakupan yang sempit:
// 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) { ... }Konvensi yang ditetapkan:
i, j, kuntuk indeks loop.vuntuk nilai,kuntuk kunci.runtuk*Request/io.Reader,wuntukWriter/ResponseWriter.erruntuk kesalahan.ctxuntukcontext.Context.- Penerima metode: 1–2 huruf yang konsisten di seluruh jenis (
s *Server,u *User). Tidak pernahthisatauself.
Semakin luas cakupannya, semakin deskriptif namanya: count lokal boleh saja, namun variabel Count yang diekspor akan memberi tahu Anda apa yang diperhitungkan.
Tidak ada awalan "I" pada antarmuka, tidak ada akhiran "Impl".
// idiomatic
type Reader interface { ... }
type fileReader struct { ... } // concrete implementation
// not idiomatic
type IReader interface { ... }
type ReaderImpl struct { ... }Antarmuka kecil sering kali menggunakan akhiran -er: Reader, Writer, Stringer, Closer. Ini menggemakan fakta bahwa mereka mendeskripsikan suatu perilaku (idealnya satu metode).
Nama paket
Sebuah paket memiliki satu nama, pendek, semua huruf kecil, tanpa garis bawah:
- ✅
bytes,http,os,userauth - ❌
userAuth,user_auth,UserAuth
Nama paket adalah awalan penggunaan dari simbolnya: bytes.Buffer, http.Client. Jadi user.User mubazir: lebih baik ganti nama jenisnya (user.Account) atau paketnya.
gofmt tidak dapat diperdebatkan
gofmt memberlakukan:
- Indentasi dengan tab (bukan spasi).
- Tempelkan tanda kurung
{pada baris yang sama dengan tanda tangan. - Impor secara berkelompok dipisahkan dengan garis kosong;
goimportsjuga menambahkan impor yang hilang. - Ruang di sekitar operator.
Selalu jalankan sebelum melakukan:
go fmt ./...
goimports -w .
go vet ./...Linter (staticcheck, golangci-lint) menambahkan aturan tambahan (variabel yang tidak digunakan, bayangan, perbandingan tidak berguna, ...).
Latihan
Buka struct Http_Client di HTTPClient (dan Url dalam URL) setelah itu konvensi Lanjutkan ke akronim berikut.
Solusi tersedia setelah 3 upaya
Balikkan visibilitas: rendi Nama pengguna esportato (maiuscolo) dan kata sandi pribadi (minuscolo).
Solusi tersedia setelah 3 upaya
Apa nama ini dan idiomatis di Go untuk jenis olahraga 'server HTTP'?
type ??? struct {}