דילוג לתוכן המרכזי
מודול 10 · שיעור 1 מתוך 546/50 בקורס~10 min
שיעורי מודול (1/5)

מוסכמות שמות וסגנון

ל-Go יש מוסכמות שמות וסגנון חזקה ולא ניתנות למשא ומתן: הפורמט הרשמי gofmt (ועל ערכת העל שלו goimports) מחליט על הזחה, ריווח וסדר ייבוא. סגנון דיון נחשב מחוץ לנושא: אתה מפעיל את gofmt -w וממשיך הלאה. זה מפנה אנרגיה לבעיות מעניינות יותר.

נראות: אותיות רישיות או קטנות

אין public/private מילות מפתח. האות הראשונה של השם קובעת את הנראות:

  • אותיות גדולות → מיוצא מחוץ לחבילה (User, Login, MaxRetries).
  • אותיות קטנות → פרטי לחבילה (user, parseLine, defaultTimeout).

זה חל על: טיפוסים, פונקציות, שיטות, משתנים, קבועים, שדות struct.

Go
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
Go
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".

Go
// 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 מוסיף גם ייבוא ​​חסר.
  • חללים מסביב למפעילים.

הרץ תמיד לפני שאתה מתחייב:

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

Linters (staticcheck, golangci-lint) מוסיפים כללים נוספים (משתנים שאינם בשימוש, הצללה, השוואות חסרות תועלת, ...).

תרגילים

פעילות גופנית#go.m10.l1.e1
ניסיונות: 0טוען...

Rinomina la struct Http_Client ב-HTTPClient (כתובת ה-URL של הקמפיין ב-URL) seguendo le convenzioni.

טוען עורך...

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#go.m10.l1.e2
ניסיונות: 0טוען...

הפוך את החשיפה: rendi שם משתמש esportato (maiuscolo) וסיסמה פרטית (minuscolo).

טוען עורך...

הפתרון זמין לאחר 3 ניסיונות

Quiz#go.m10.l1.e3
מוכן

האם אתה צריך להשתמש ב-Go עבור 'שרת HTTP'?

Go
type ??? struct {}
אפשרויות תשובה