AzLearn

تصميم الحزم

Package Design

مفهوم ~18 دقيقة

تصميم الحزم — Package Design

الحزمة (Package) هي وحدة التنظيم الأساسية في Go. كل مجلد = حزمة واحدة. تصميم الحزم بشكل جيد هو ما يفرق بين مشروع Go مبتدئ ومحترف.

التصدير — Exported vs Unexported

في Go، الحرف الأول يُحدد هل الشيء مرئي خارج الحزمة:

main.go

مجلد internal/ — الحزم الداخلية

internal/ هو مجلد خاص في Go — الحزم داخله لا يمكن استيرادها إلا من الحزم الأم:

myproject/
├── internal/
│   ├── auth/       # فقط myproject يستطيع استيرادها
│   └── database/   # لا يستطيع مشروع آخر استيرادها
├── pkg/
│   └── utils/      # أي مشروع يستطيع استيرادها
└── main.go

هذا يُعطيك ضمان أن الأشياء الداخلية لن يعتمد عليها أحد.

دالة init()

init() تُنفّذ تلقائياً عند استيراد الحزمة — قبل main():

main.go

متى تستخدم init():

  • تسجيل مشغّلات قواعد البيانات (database/sql drivers)
  • تهيئة إعدادات ثابتة
  • التحقق من متغيرات البيئة

متى لا تستخدمها:

  • منطق أعمال معقد
  • عمليات I/O ثقيلة
  • أي شيء قد يفشل (صعب الاختبار)

أفضل ممارسات تصميم الحزم

main.go

نشر وحدة — Publishing a Module

main.go

توثيق GoDoc

// Package auth provides authentication and authorization utilities.
// It supports JWT tokens and API key authentication.
package auth

// User represents an authenticated user in the system.
// A User is created after successful authentication via Authenticate.
type User struct {
    ID    int
    Name  string
    Email string
}

// Authenticate validates credentials and returns a User.
// It returns ErrInvalidCredentials if the email or password is wrong.
//
// Example:
//
//	user, err := auth.Authenticate("[email protected]", "password")
//	if err != nil {
//	    log.Fatal(err)
//	}
func Authenticate(email, password string) (*User, error) {
    // ...
}
تحدي — Challenge