دروس الوحدة (1/5)
اصطلاحات التسمية والأسلوب
يحتوي Go على اصطلاحات تسمية ونمط قوية و غير قابلة للتفاوض: المنسق الرسمي gofmt (ومجموعته الشاملة goimports) هو الذي يقرر المسافة البادئة، والتباعد، وترتيب الاستيراد. تعتبر مناقشة الأسلوب خارج الموضوع: يمكنك تشغيل gofmt -w والمضي قدمًا. هذا يحرر الطاقة لمشاكل أكثر إثارة للاهتمام.
الرؤية: أحرف كبيرة أو صغيرة
لا توجد كلمات رئيسية public/private. يحدد الحرف الأول من الاسم مستوى الرؤية:
- أحرف كبيرة → تم تصديرها خارج الحزمة (
User،Login،MaxRetries). - أحرف صغيرة → خاصة بالحزمة (
user،parseLine،defaultTimeout).
ينطبق هذا على: الأنواع، والوظائف، والأساليب، والمتغيرات، والثوابت، وحقول البنية.
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
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.- محمي_INLINE_40 للأخطاء.
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 ./...تضيف الفلاتر (staticcheck، golangci-lint) قواعد إضافية (المتغيرات غير المستخدمة، والتظليل، والمقارنات غير المفيدة، ...).
تمارين
قم بتسمية بنية Http_Client في HTTPClient (ونطاق URL في URL) بعد الانتقال إلى الاختصارات المطلوبة.
الحل متاح بعد 3 من المحاولات
عكس الرؤية: قم بإنشاء اسم المستخدم (الكبير) وكلمة المرور الخاصة (الصغيرة).
الحل متاح بعد 3 من المحاولات
ما هي الأسماء الاصطلاحية لهذه الأسماء في Go لنوع تم إنشاؤه من "خادم HTTP"؟
type ??? struct {}