ثلاث طرق لتعريف متغيّر
var name string = "براء" // النوع صريح والقيمة صريحة
var age = 25 // النوع يُستنتج من القيمة: int
city := "عمّان" // المختصرة: تعريف + استنتاج النوع
fmt.Println(name, age, city)
varتعمل في أي مكان: داخل الدوال وخارجها (على مستوى الحزمة).:=تعمل داخل الدوال فقط، وهي الأكثر استخدامًا في الكود اليومي.- النوع في Go يُكتب بعد الاسم (
age int)، عكس C وJava.
متى تكتب var إذن؟ في ثلاث حالات: خارج الدوال، أو حين تريد القيمة الصفرية بلا قيمة ابتدائية (var total int)، أو حين تريد نوعًا غير الذي يُستنتج (var ratio float64 = 1).
القيمة الصفرية: لا متغيّرات "فارغة"
متغيّر بلا قيمة ابتدائية لا يحتوي قيمة عشوائية كما في C، بل يأخذ القيمة الصفرية لنوعه:
var count int // 0
var label string // ""
var done bool // false
fmt.Println(count, label == "", done) // 0 true false
التفاصيل الكاملة لكل نوع في درس أنواع البيانات.
تعريف عدّة متغيّرات معًا
x, y := 1, 2
x, y = y, x // تبديل بلا متغيّر مؤقت
fmt.Println(x, y) // 2 1
var (
host = "localhost"
port = 8080
)
fmt.Println(host, port)
:= تحتاج متغيّرًا جديدًا واحدًا على الأقل
a := 1
// a := 2 // ❌ no new variables on left side of :=
a = 2 // ✅ إسناد عادي لمتغيّر موجود
b, err := 10, error(nil)
c, err := 20, error(nil) // ✅ c جديد، و err يُعاد استخدامه
fmt.Println(a, b, c, err)
هذه القاعدة تسمح بالنمط المتكرّر value, err := ... مرة بعد مرة في نفس الدالة، ما دام في الطرف الأيسر اسم جديد.
المتغيّر غير المستخدم خطأ ترجمة
func main() {
unused := 5 // ❌ declared and not used: unused
}
Go ترفض البرنامج إذا عرّفت متغيّرًا محلّيًا ولم تستخدمه، وكذلك الحزمة المستوردة غير المستخدمة. يبدو هذا مزعجًا في البداية، لكنه يمنع بقايا الكود الميت ويكشف أخطاء مثل حساب قيمة ثم نسيان استخدامها. إذا أردت تجاهل قيمة مُرجعة عمدًا، أسندها لـ _:
n, _ := strconv.Atoi("42") // نتجاهل الخطأ عمدًا (هنا فقط لأن النص ثابت ومضمون)
fmt.Println(n)
الطباعة
name := "سارة"
age := 22
fmt.Println("مرحبًا", name) // يفصل بمسافات ويضيف سطرًا جديدًا
fmt.Printf("الاسم %s والعمر %d\n", name, age) // تنسيق صريح
fmt.Printf("%v %T\n", age, age) // 22 int: %v أي قيمة، %T نوعها
%v تطبع أي قيمة بصيغتها الافتراضية، و%T تطبع نوعها، وكلاهما مفيد جدًّا أثناء التعلّم والتصحيح.
الحجب (Shadowing): فخّ := داخل الكتل
total := 0
if true {
total := 10 // متغيّر جديد يحجب الخارجي داخل الكتلة فقط
fmt.Println(total) // 10
}
fmt.Println(total) // 0: الخارجي لم يتغيّر
داخل if أو for جديدة، := تُنشئ متغيّرًا جديدًا بنفس الاسم بدل تعديل الخارجي. هذا من أشهر أسباب "لماذا لم تتغيّر القيمة؟". استخدم = حين تقصد تعديل الموجود.
أخطاء شائعة
:=خارج الدوال: خطأ ترجمة؛ استخدمvarعلى مستوى الحزمة.:=لتعديل متغيّر موجود داخل كتلة: تحجبه بدل أن تعدّله.- متغيّر أو import غير مستخدم: البرنامج لا يُترجم. احذفه أو أسنده لـ
_مؤقتًا. - خلط الأنواع:
var x int = 2.5خطأ؛ Go لا تحوّل ضمنيًا بين الأنواع (درس أنواع البيانات).
🎯 التالي: الشروط والحلقات والدوال.