الانتقال إلى المحتوى الرئيسي
الوحدة 10 · الدرس 1 من 546/50 في الدورة~10 min
دروس الوحدة (1/5)

اصطلاحات التسمية والأسلوب

يحتوي Go على اصطلاحات تسمية ونمط قوية و غير قابلة للتفاوض: المنسق الرسمي gofmt (ومجموعته الشاملة goimports) هو الذي يقرر المسافة البادئة، والتباعد، وترتيب الاستيراد. تعتبر مناقشة الأسلوب خارج الموضوع: يمكنك تشغيل gofmt -w والمضي قدمًا. هذا يحرر الطاقة لمشاكل أكثر إثارة للاهتمام.

الرؤية: أحرف كبيرة أو صغيرة

لا توجد كلمات رئيسية public/private. يحدد الحرف الأول من الاسم مستوى الرؤية:

  • أحرف كبيرة → تم تصديرها خارج الحزمة (User، Login، MaxRetries).
  • أحرف صغيرة → خاصة بالحزمة (user، parseLine، defaultTimeout).

ينطبق هذا على: الأنواع، والوظائف، والأساليب، والمتغيرات، والثوابت، وحقول البنية.

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

حقل البنية "الخاص" ليس متسلسلًا بواسطة encoding/json (راجع الوحدة 8)، ولا يمكن الوصول إليه من الاختبارات في pkg_test.

CamelCase، لا Snake_case أبدًا

لا توجد شرطات سفلية في الأسماء متعددة الكلمات:

  • ✅ 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 الإيجاز بنفس الوضوح في النطاقات الضيقة:

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.
  • محمي_INLINE_40 للأخطاء.
  • 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 ./...

تضيف الفلاتر (staticcheck، golangci-lint) قواعد إضافية (المتغيرات غير المستخدمة، والتظليل، والمقارنات غير المفيدة، ...).

تمارين

تمرين#go.m10.l1.e1
المحاولات: 0جارٍ التحميل…

قم بتسمية بنية Http_Client في HTTPClient (ونطاق URL في URL) بعد الانتقال إلى الاختصارات المطلوبة.

جارٍ تحميل المحرر…

الحل متاح بعد 3 من المحاولات

تمرين#go.m10.l1.e2
المحاولات: 0جارٍ التحميل…

عكس الرؤية: قم بإنشاء اسم المستخدم (الكبير) وكلمة المرور الخاصة (الصغيرة).

جارٍ تحميل المحرر…

الحل متاح بعد 3 من المحاولات

Quiz#go.m10.l1.e3
جاهز

ما هي الأسماء الاصطلاحية لهذه الأسماء في Go لنوع تم إنشاؤه من "خادم HTTP"؟

Go
type ??? struct {}
خيارات الإجابة