Viper للغة Go: دليل شامل مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما هو Viper ولماذا هو مطلوب؟

\n\n

Viper هي واحدة من أشهر المكتبات لإدارة التهيئة في تطبيقات Go. توفر طريقة شاملة ومرنة للعمل مع الإعدادات التي يمكن أن تأتي من مصادر مختلفة: ملفات التهيئة (JSON، TOML، YAML، HCL، INI، envfile)، متغيرات البيئة، وسائط سطر الأوامر، مخازن بعيدة (etcd، Consul) وحتى القيم الافتراضية المحددة في الكود.

\n\n

لماذا نحتاج Viper؟ في التطوير الحديث، نادراً ما تكون التهيئة ثابتة. قد يعمل التطبيق في بيئات مختلفة (dev، staging، production)، ويستخدم قواعد بيانات مختلفة، ومفاتيح API، ومنافذ. يحل Viper عدة مهام رئيسية:

\n
    \n
  • هيكل هرمي: يسمح بتداخل الإعدادات داخل بعضها البعض (مثل database.host).
  • \n
  • أولوية المصادر: يحدد بوضوح أي مصدر له أولوية أعلى (مثل، تتجاوز الوسائط متغيرات البيئة).
  • \n
  • الربط التلقائي: يمكنه ربط متغيرات البيئة تلقائياً بمفاتيح التهيئة.
  • \n
  • دعم تنسيقات متعددة: لا حاجة لكتابة محللات لكل تنسيق.
  • \n
  • أمان الأنواع: يوفر طرقاً للحصول على القيم مع تحويلها إلى النوع المطلوب (GetInt، GetString، GetBool، إلخ).
  • \n
\n\n

يعتبر Viper مثالياً لإنشاء الخدمات المصغرة، تطبيقات الويب، أدوات CLI، وأي برامج أخرى بلغة Go تتطلب إدارة مرنة للإعدادات.

\n\n

تثبيت Viper

\n\n

يتم تثبيت Viper بالطريقة القياسية لـ Go – عبر مدير الحزم go get. تأكد من تثبيت Go الإصدار 1.18 أو أعلى.

\n\n
go get github.com/spf13/viper
\n\n

بعد تنفيذ هذا الأمر، ستتم إضافة Viper إلى ملف go.mod الخاص بك. للعمل مع تنسيقات ملفات محددة (مثل YAML)، قد تحتاج أيضاً إلى مكتبات إضافية، لكن Viper يأتي مع دعم أساسي لـ JSON و TOML و YAML "مباشر من الصندوق". إذا كنت تستخدم go mod، فسيتم سحب التبعيات تلقائياً.

\n\n

مثال على الاستيراد في الكود:

\n
import (\n    "github.com/spf13/viper"\n)
\n\n

بداية سريعة: المثال الأول مع Viper

\n\n

لنكتب برنامجاً بسيطاً يقرأ التهيئة من ملف config.yaml ويطبع تحية.

\n\n

أنشئ ملف config.yaml:

\n
app:\n  name: "MyApp"\n  version: "1.0.0"\nserver:\n  port: 8080
\n\n

الآن أنشئ ملف main.go:

\n
package main\n\nimport (\n    "fmt"\n    "log"\n    "github.com/spf13/viper"\n)\n\nfunc main() {\n    // تعيين اسم ملف التهيئة\n    viper.SetConfigName("config")\n    // تعيين نوع الملف\n    viper.SetConfigType("yaml")\n    // إضافة مسارات البحث\n    viper.AddConfigPath(".")\n\n    // قراءة التهيئة\n    if err := viper.ReadInConfig(); err != nil {\n        log.Fatalf("خطأ في قراءة التهيئة: %s", err)\n    }\n\n    // الحصول على القيم\n    appName := viper.GetString("app.name")\n    appVersion := viper.GetString("app.version")\n    port := viper.GetInt("server.port")\n\n    fmt.Printf("التطبيق: %s (الإصدار %s) يعمل على المنفذ %d\\n", appName, appVersion, port)\n}
\n\n

قم بتشغيل البرنامج:

\n
go run main.go
\n\n

المخرجات:

\n
التطبيق: MyApp (الإصدار 1.0.0) يعمل على المنفذ 8080
\n\n

يوضح هذا المثال البسيط الآلية الأساسية: نحدد لـ Viper أين يبحث عن الملف، نقرأه، ثم نستخرج القيم باستخدام المفاتيح.

\n\n

الطرق والوظائف الأساسية لـ Viper

\n\n

يوفر Viper واجهة برمجة تطبيقات غنية. أدناه سنشرح 10 طرق رئيسية مع وصف تفصيلي وأمثلة.

\n\n

1. SetConfigName

\n<

توصيات