ماهو المتغير
المتغير هو عبارة عن “تسمية/اسم” يتم إعطاؤه لمكان معين في الذاكرة حيث يُخزن فيه قيمة لها نوع معين (نص, رقم …الخ) وفي لغة البرمجة يوجد عدة طرق متشابهة لكتابة/إعلان المتغيرات .
إعلان متغير
يتم إعلان المتغير في لغة غو عن طريق الكلمة المفتاحية var وثم اسم المتغير name وثم نوع هذا المتغير type “حيث تخالف لغة غو الطريقة التقليدية بإعلان المتغيرات في لغات البرمجة الشهيرة, ففي اللغات الاخرى يتم اعلان نوع المتغير أولاً وثم اسمه, أما في لغة غو يتم إعلان اسم المتغير وثم نوعه”
package main
import "fmt"
func main() {
// إعلان متغير ونوعه, بدون قيمة أولية
var age int
fmt.Println("my age is", age)
}
نلاحظ أن المتغير ذو الاسم age نوعه عددي/رقمي int, ولم نسند له قيمة أولية, ولذلك تقوم لغة غو بإسناد قيمة صفرية له, حيث أن قيمة المتغير age الان هي “صفر” حيث أن الكود السابق سيطبع لنا
my age is 0
وطالما أن المتغير قد سبق أن تم تعريفه وإعلان نوعه, فلا داعي لفعل ذلك مجدداً, ويمكننا أن نسند له قيمة مباشرة كالاتي :
package main
import "fmt"
func main() {
// إعلان متغير ونوعه, بدون قيمة أولية
var age int
fmt.Println("my age is", age)
// إسناد القيمة الرقمية 25 للمتغير بعد أن تم إعلانه سابقاً
age = 25
fmt.Println("my new age is", age)
}
والنتيجة
my new age is 25
إعلان متغير جديد مع إسناد قيمة أولية ويمكن أيضاً أن نسند قيمة أولية للمتغير عند لحظة تعريفه/إعلانه
package main
import "fmt"
func main() {
// إعلان المتغير مع قيمة أولية Firas
var name string = "Firas"
fmt.Println("my name is ", name)
}
والنتيجة
my name is Firas
نلاحظ من الأمثلة السابقة أن في لغة غو لا داعي لاستخدام الفاصلة المنقوطة ; لإنهاء التصريحات Statements
أنواع البيانات في المتغيرات
اذا كان للمتغير قيمة أولية عند إعلانه, ستكون لغة غو قادرة تلقائياً على التعرف على نوع بيانات المتغير من خلال نوع بيانات قيمته الأولية, ولذلك يمكننا أن نهمل ذكر نوع المتغير type
فمثلاً في المثال السابق يمكننا إهمال كتابة نوع المتغير (string) وسيعمل البرنامج بشكل طبيعي بدون أخطاء
مع الانتباه والحذر حيث أن هذه الحالة تنطبق فقط عندما يكون للمتغير قيمة أولية, أما في المثال الأول نلاحظ ان المتغير age ليس له قيمة أولية ولذلك إذا عرفنا المتغير بدون ذكر نوع بياناته سينتج لنا خطأ .
إعلان عدة متغيرات بآن واحد
يمكننا إعلان عدة متغيرات بجملة تعريف واحدة (شبيهة بلغة بايثون) كالآتي
package main
import "fmt"
func main() {
// المتغير width والمتغير height
var width, height int = 100, 50
fmt.Println("width is", width, "height is", height)
}
وطالما أن للمتغيرات قيمة أولية فيمكننا إهمال ذكر نوعها في جملة الإعلان
package main
import "fmt"
func main() {
//"int" is dropped
var width, height = 100, 50
fmt.Println("width is", width, "height is", height)
}
مثال على إعلان عدة متغيرات بدون قيمة أولية, ثم إسناد قيمة لاحقاً
package main
import "fmt"
func main() {
var width, height int
fmt.Println("width is", width, "height is", height)
width = 100
height = 50
fmt.Println("new width is", width, "new height is ", height)
}
والنتيجة
width is 0 height is 0
new width is 100 new height is 50
إعلان عدة متغيرات ذات أنواع بيانات مختلفة بآن واحد
لاحظ سابقاً أننا عندما أعلنا المتغيرين width و height كان لهما نفس نوع البيانات وهو int ولكن ماذا اذا أردنا إعلان عدة متغيرات ذات أنواع مختلفة فيما بينها ؟
يمكننا ذلك من خلال الصيغة التالية
var (
name = initialvalue1
age = initialvalue2
)
مثال
package main
import "fmt"
func main() {
var (
name = "Firas"
age = 25
)
fmt.Println("my name is", name, ", age is", age)
}
والنتيجة
my name is Firas , age is 25
إعلان المتغيرات بشكل مختصر Shorthand
ويوجد طريقة اخرى مختصرة لإعلان المتغيرات عبر الصيغة الاتية
name := initialvalue
مثال
package main
import "fmt"
func main() {
//shorthand declaration
name, age := "Firas", 29
fmt.Println("my name is", name, "age is", age)
}
ملاحظة: عند استخدام الطريقة المختصرة في إعلان المتغيرات, علينا مراعاة إسناد قيم أولية لها دائماً ويمكننا استخدام الطريقة المختصرة سواء في إعلان متغيرات جديدة أو تعديل قيم متغيرات قد سبق إعلانها سابقاً*
ملاحظة: الطريقة المختصرة لايُمكن استخدامها إلا ضمن نطاق الدوال Function ( في المثال السابق تمت الطريقة المختصرة ضمن الدالة main مثلاً )
مثال آخر
package main
import "fmt"
func main() {
// declare variables a and b
a, b := 20, 30
fmt.Println("a is", a, "b is", b)
// b is already declared but c is new
b, c := 40, 50
fmt.Println("b is", b, "c is", c)
}
والنتيجة
a is 20 b is 30
b is 40 c is 50
ملاحظة: يمكننا استخدام الطريقة المختصرة بشرط أن يكون متغير واحد على الأقل جديد وغير معلن سابقاً
فمثلاً المثال التالي سينتج خطأ
package main
import "fmt"
func main() {
//a and b declared
a, b := 20, 30
fmt.Println("a is", a, "b is", b)
//error, no new variables
a, b := 40, 50
}
وسينتج لنا رسالة الخطأ التالية
no new variables on left side of :=