Chuyển đến nội dung chính
Mô-đun 10 · Bài học 1 trong tổng số 546/50 trong khóa học~10 min
Bài học theo mô-đun (1/5)

Quy ước và phong cách đặt tên

Go có các quy ước đặt tên và phong cách mạnh và không thể thương lượng: trình định dạng chính thức gofmt (và siêu tập hợp của nó goimports) quyết định thụt lề, giãn cách và thứ tự nhập. Phong cách thảo luận được coi là lạc đề: bạn chạy gofmt -w và tiếp tục. Điều này giải phóng năng lượng cho những vấn đề thú vị hơn.

Khả năng hiển thị: chữ hoa hoặc chữ thường

Không có từ khóa public/private nào. Chữ cái đầu tiên của tên xác định khả năng hiển thị:

  • Chữ hoa → xuất ra ngoài gói (User, Login, MaxRetries).
  • Chữ thường → riêng tư cho gói (user, parseLine, defaultTimeout).

Điều này áp dụng cho: kiểu, hàm, phương thức, biến, hằng, trường cấu trúc.

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

Trường cấu trúc "riêng tư" không được tuần tự hóa bởi encoding/json (xem Mô-đun 8) và không thể truy cập được từ các thử nghiệm trong pkg_test.

CamelCase, không bao giờ là snake_case

Không có dấu gạch dưới trong tên nhiều từ:

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

Các từ viết tắt toàn chữ hoa (hoặc toàn chữ thường, nếu trong phạm vi riêng tư):

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

Tên ngắn cho phạm vi ngắn

Phong cách Go ưu tiên sự ngắn gọn nhưng vẫn rõ ràng trong phạm vi hẹp:

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

Các quy ước đã được thiết lập:

  • i, j, k cho các chỉ số vòng lặp.
  • v cho giá trị, k cho khóa.
  • r cho *Request/io.Reader, w cho Writer/ResponseWriter.
  • err vì lỗi.
  • ctx cho context.Context.
  • Bộ nhận phương thức: 1–2 chữ cái nhất quán trên toàn bộ loại (s *Server, u *User). Không bao giờ this hoặc self.

Phạm vi càng rộng thì tên càng phải mang tính mô tả: count cục bộ cũng được, nhưng biến Count được xuất sẽ cho bạn biết giá trị của nó.

Không có tiền tố "I" trên giao diện, không có hậu tố "Impl"

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

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

Các giao diện nhỏ thường có hậu tố -er: Reader, Writer, Stringer, Closer. Nó lặp lại thực tế là họ mô tả một hành vi (lý tưởng là một phương pháp duy nhất).

Tên gói

Một gói có một tên, viết tắt, tất cả đều là chữ thường, không có dấu gạch dưới:

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

Tên gói là tiền tố sử dụng của các ký hiệu của gói: bytes.Buffer, http.Client. Vì vậy user.User là không cần thiết: tốt hơn nên đổi tên loại (user.Account) hoặc gói.

gofmt không cần phải tranh luận

gofmt thực thi:

  • Thụt lề bằng tab (không phải dấu cách).
  • Ngoặc { cùng dòng với chữ ký.
  • Nhập theo nhóm cách nhau bởi một dòng trống; goimports cũng bổ sung thêm nội dung nhập bị thiếu.
  • Không gian xung quanh người vận hành.

Luôn chạy trước khi cam kết:

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

Linters (staticcheck, golangci-lint) thêm các quy tắc bổ sung (biến không được sử dụng, tạo bóng, so sánh vô dụng, ...).

Bài tập

tập thể dục#go.m10.l1.e1
Nỗ lực: 0Đang tải…

Rinomina la struct Http_Client in HTTPClient (và URL cắm trong URL) sau đó bạn sẽ có thể sử dụng các nút này.

Đang tải trình chỉnh sửa…

Giải pháp khả dụng sau 3 lần thử

tập thể dục#go.m10.l1.e2
Nỗ lực: 0Đang tải…

Đảo ngược hiển thị: hiển thị Tên người dùng thể thao (maiuscolo) và mật khẩu riêng tư (trừ màu).

Đang tải trình chỉnh sửa…

Giải pháp khả dụng sau 3 lần thử

Quiz#go.m10.l1.e3
Sẵn sàng

Câu hỏi mà bạn đặt ra có phải là thành ngữ trong Go per un tipo esportato 'server HTTP'?

Go
type ??? struct {}
Tùy chọn trả lời