لماذا Go هي تذكرتك الذهبية إلى عالم الخلفية
\nإذا كنت تقرأ هذا، فأنت بالتأكيد تعلم بالفعل أن Go (Golang) ليست مجرد لغة عصرية أخرى. إنها اللغة التي كُتبت بها Docker و Kubernetes و Prometheus ونصف البنية التحتية للإنترنت الحديث. لكن هل تعرف ما يميز المطور المتميز عن المبتدئ؟ ليس معرفة القواعد النحوية، بل المشاريع الحقيقية للمحفظة بلغة Go.
\nلقد سئم أصحاب العمل من "قوائم المهام" النمطية بلغة React. إنهم بحاجة إلى أشخاص يفهمون الـ Goroutines، ويعرفون كيفية تصميم API، ولا يخافون من العمل مع الشبكة. في هذه المقالة، لن نقوم فقط بسرد الأفكار - بل سنحلل 5 مشاريع مع أجزاء كود حقيقية ستغطي 90% من أسئلة المقابلة. هيا بنا!
\n\nالمشروع رقم 1: RESTful API لتقصير الروابط (URL Shortener)
\nلماذا هذا مهم؟
\nهذا كلاسيكي من نوعه. يجب أن يكون أي مطور خلفية قادرًا على رفع خادم HTTP، والعمل مع الـ middleware والتوجيه. مشروع "مُقصّر الروابط" يتناسب تمامًا مع مشاريع Golang للمحفظة، حيث يسمح بإظهار فهم الهياكل والتجزئة والعمل مع قواعد البيانات.
\n\nماذا سنكتب؟
\nسننشئ خادمًا بسيطًا باستخدام net/http (بدون مكتبات خارجية لإظهار معرفتنا بالمكتبة القياسية). سيقبل الخادم رابطًا طويلًا ويعيد كودًا قصيرًا (على سبيل المثال، /abc123).
package main\n\nimport (\n "crypto/rand"\n "encoding/hex"\n "encoding/json"\n "fmt"\n "net/http"\n "sync"\n)\n\ntype URLStore struct {\n mu sync.RWMutex\n data map[string]string\n}\n\nvar store = URLStore{data: make(map[string]string)}\n\nfunc generateShortID() string {\n bytes := make([]byte, 4)\n rand.Read(bytes)\n return hex.EncodeToString(bytes)\n}\n\nfunc shortenHandler(w http.ResponseWriter, r *http.Request) {\n if r.Method != http.MethodPost {\n http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)\n return\n }\n\n var req struct {\n URL string `json:"url"`\n }\n if err := json.NewDecoder(r.Body).Decode(&req); err != nil {\n http.Error(w, "Bad request", http.StatusBadRequest)\n return\n }\n\n shortID := generateShortID()\n store.mu.Lock()\n store.data[shortID] = req.URL\n store.mu.Unlock()\n\n w.Header().Set("Content-Type", "application/json")\n json.NewEncoder(w).Encode(map[string]string{\n "short_url": fmt.Sprintf("http://localhost:8080/%s", shortID),\n })\n}\n\nfunc redirectHandler(w http.ResponseWriter, r *http.Request) {\n shortID := r.URL.Path[1:]\n store.mu.RLock()\n originalURL, ok := store.data[shortID]\n store.mu.RUnlock()\n\n if !ok {\n http.NotFound(w, r)\n return\n }\n http.Redirect(w, r, originalURL, http.StatusFound)\n}\n\nfunc main() {\n http.HandleFunc("/shorten", shortenHandler)\n http.HandleFunc("/", redirectHandler)\n fmt.Println("Server started at :8080")\n http.ListenAndServe(":8080", nil)\n}\n\nماذا ستطور؟
\n- \n
- العمل مع
sync.RWMutexللوصول المتزامن \n - تسلسل JSON \n
- هندسة نظيفة بدون أطر عمل \n
هذا المشروع للمحفظة بلغة Go سيظهر أنك تفهم كيف تعمل الأشياء "تحت الغطاء".
\n\nالمشروع رقم 2: أداة CLI لمراقبة النظام
\nلماذا هذا في المحفظة؟
\nتشتهر Go بأدواتها الطرفية. كتابة top أو htop خاص بك هي طريقة ممتازة لإظهار العمل مع استدعاءات النظام والـ Goroutines. هذا واحد من أكثر المشاريع المفيدة للمحفظة بلغة Go، لأنه قريب من مهام DevOps الحقيقية.
الكود: مراقبة وحدة المعالجة المركزية والذاكرة
\npackage main\n\nimport (\n "fmt"\n "os"\n "os/exec"\n "strconv"\n "strings"\n "time"\n)\n\nfunc getCPUPercent() (float64, error) {\n out, err := exec.Command("sh", "-c", "t