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.
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
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:
// 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, kcho các chỉ số vòng lặp.vcho giá trị,kcho khóa.rcho*Request/io.Reader,wchoWriter/ResponseWriter.errvì lỗi.ctxchocontext.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ờthishoặcself.
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"
// 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;
goimportscũ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:
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
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.
Giải pháp khả dụng sau 3 lần thử
Đả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).
Giải pháp khả dụng sau 3 lần thử
Câu hỏi mà bạn đặt ra có phải là thành ngữ trong Go per un tipo esportato 'server HTTP'?
type ??? struct {}