تصميم الحزم
Package Design
مفهوم
~18 دقيقة
تصميم الحزم — Package Design
الحزمة (Package) هي وحدة التنظيم الأساسية في Go. كل مجلد = حزمة واحدة. تصميم الحزم بشكل جيد هو ما يفرق بين مشروع Go مبتدئ ومحترف.
التصدير — Exported vs Unexported
في Go، الحرف الأول يُحدد هل الشيء مرئي خارج الحزمة:
main.go
Output:
مجلد internal/ — الحزم الداخلية
internal/ هو مجلد خاص في Go — الحزم داخله لا يمكن استيرادها إلا من الحزم الأم:
myproject/
├── internal/
│ ├── auth/ # فقط myproject يستطيع استيرادها
│ └── database/ # لا يستطيع مشروع آخر استيرادها
├── pkg/
│ └── utils/ # أي مشروع يستطيع استيرادها
└── main.go
هذا يُعطيك ضمان أن الأشياء الداخلية لن يعتمد عليها أحد.
دالة init()
init() تُنفّذ تلقائياً عند استيراد الحزمة — قبل main():
main.go
Output:
متى تستخدم init():
- تسجيل مشغّلات قواعد البيانات (
database/sqldrivers) - تهيئة إعدادات ثابتة
- التحقق من متغيرات البيئة
متى لا تستخدمها:
- منطق أعمال معقد
- عمليات I/O ثقيلة
- أي شيء قد يفشل (صعب الاختبار)
أفضل ممارسات تصميم الحزم
main.go
Output:
نشر وحدة — Publishing a Module
main.go
Output:
توثيق 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
أنشئ نوع User مع حقول مُصدّرة وخاصة وأسلوب IsValid