שיעורי מודול (1/5)
מוסכמות שמות וסגנון
ל-Go יש מוסכמות שמות וסגנון חזקה ולא ניתנות למשא ומתן: הפורמט הרשמי gofmt (ועל ערכת העל שלו goimports) מחליט על הזחה, ריווח וסדר ייבוא. סגנון דיון נחשב מחוץ לנושא: אתה מפעיל את gofmt -w וממשיך הלאה. זה מפנה אנרגיה לבעיות מעניינות יותר.
נראות: אותיות רישיות או קטנות
אין public/private מילות מפתח. האות הראשונה של השם קובעת את הנראות:
- אותיות גדולות → מיוצא מחוץ לחבילה (
User,Login,MaxRetries). - אותיות קטנות → פרטי לחבילה (
user,parseLine,defaultTimeout).
זה חל על: טיפוסים, פונקציות, שיטות, משתנים, קבועים, שדות struct.
type User struct {
Name string // exported
email string // private to the package
}שדה מבנה "פרטי" לא מסודר על ידי encoding/json (ראה מודול 8), והוא אינו נגיש מבדיקות ב-pkg_test.
CamelCase, אף פעם לא נרתיק_נחש
אין קווים תחתונים בשמות מרובי מילים:
- ✅
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
}שמות קצרים להיקפים קצרים
גו סטייל מעדיף קיצור בבהירות שווה בהיקפים צרים:
// 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 ./...Linters (staticcheck, golangci-lint) מוסיפים כללים נוספים (משתנים שאינם בשימוש, הצללה, השוואות חסרות תועלת, ...).
תרגילים
Rinomina la struct Http_Client ב-HTTPClient (כתובת ה-URL של הקמפיין ב-URL) seguendo le convenzioni.
הפתרון זמין לאחר 3 ניסיונות
הפוך את החשיפה: rendi שם משתמש esportato (maiuscolo) וסיסמה פרטית (minuscolo).
הפתרון זמין לאחר 3 ניסיונות
האם אתה צריך להשתמש ב-Go עבור 'שרת HTTP'?
type ??? struct {}