متغیرها و انواع آن | گولنگ به زبان ساده

تاریخ انتشار:
متغیرها و انواع آن | گولنگ به زبان ساده
توی این قسمت با متغییرها و انواع آن آشنا میشیم و یاد میگیریم چطور یک متغییر تعریف کنیم و به درستی ازش استفاده کنیم.

توی این قسمت به بررسی موارد زیر میپردازیم:

  • متغیر چیست؟
  • چطور یک متغیر تعریف کنیم؟
  • چطور از یک متغیر استفاده کنیم؟
  • انواع داده

متغیر چیست؟

متغیر در برنامه‌نویسی مثل یک جعبه یا ظرف است که می‌توانید در آن چیزهایی قرار دهید و هر وقت که بخواهید به آن چیزها دسترسی داشته باشید. هر متغیر یک نام دارد که با استفاده از آن نام می‌توانیم به مقدار داخل آن دسترسی پیدا کنیم.

هر متغیر دارای یک نوع است که با توجه به نوع آن میتوانیم داده ی مورد نظرمان را درون متغیر ذخیره کنیم. مثلا اگر نوع متغیری عددی است, به ما اجازه ذخیره کردن مقادیر عددی را میدهد و نمیتونیم داده متنی توی متغیری که عددی هست ذخیره کنیم.

چطور یک متغیر تعریف کنیم؟

در زبان Go، می‌توانیم به دو روش متغیرها را تعریف کنیم و به آنها مقدار بدهیم.

// 1. using var keyword:
var age int
age = 25
var height int = 155

// 2. using := operator
weight := 71
name := "John Doe"

همچنین با یکبار استفاده از var می‌توانیم چند متغیر را همزمان تعریف کنیم:

// تعریف متغیر
var (
    job    string
    weight float64
)

// تعریف و مقداردهی متغیر
var (
    name    string = "Alice"
    age     int    = 25
    height  float64 = 1.68
    isStudent bool  = true
)

چطور از یک متغیر استفاده کنیم؟

بعد از تعریف متغیرها، با استفاده از نام متغیرها می‌توانیم از آنها در برنامه استفاده کنیم.

package main

import "fmt"

func main() {
    name := "Alice"
    age := 25
    height := 1.68
    isStudent := true

    fmt.Println("Name:", name)
    fmt.Println("Age:", age)
    fmt.Println("Height:", height)
    fmt.Println("Is Student:", isStudent)
}

همچنین میتونیم مقدار متغیرها را در طول برنامه تغییر دهیم:

package main

import "fmt"

func main() {
    age := 25
    fmt.Println("Age:", age)

    age = 26
    fmt.Println("New Age:", age)
}

انواع داده

در زبان برنامه‌نویسی Go، متغیرها می‌توانند انواع مختلفی داشته باشند که هر کدام برای ذخیره‌سازی نوع خاصی از داده‌ها به کار می‌روند.

نوع داده ها در زبان گولنگ به ۴ دسته تقسیم میشود:

  1. Basic
  2. Composite
  3. Reference
  4. Interface

اینجا به بررسی نوع داده basic میپردازیم و باقی موارد رو در قسمت های بعد بررسی میکنیم.

نوع داده basic به ۳ دسته عددی, بولی و رشته ای تقسیم میشود.

نوع‌ داده عددی (numeric type): نوع‌های عددی در زبان Go شامل انواع مختلفی از اعداد صحیح، اعشاری و مختلط هستند. 

اعداد صحیح خود به دو دسته علامت دار (signed) و بدون علامت (unsigned) نیز تقسیم میشوند. حالت بدون علامت قابلیت ذخیره اعداد منفی را ندارد.

همچنین گولنگ بر حسب میزان حافظه مورد نیاز حالت های ۸ ,۱۶ ,۳۲ و ۶۴ بیتی از اعداد صحیح رو ارائه میدهد. مثلا در ۸ بیت میتونیم ۲۸ = ۲۵۶ عدد ذخیره کنیم که برای حالت علامت دار از منفی ۱۲۸ تا مثبت ۱۲۷ را میتوان ذخیره کرد. و برای عدد های بدون علامت از ۰ تا ۲۵۵ را میتوان ذخیره کرد.

package main

import "fmt"

func main() {
	// signed integers: int8 int16 int32 int64
	// unsigned integers: uint8 uint16 uint32 uint64
    var age int = 25
    var smallNumber int8 = -128
    var largeNumber uint64 = 18446744073709551615

    fmt.Println("Age:", age)
    fmt.Println("Small Number:", smallNumber)
    fmt.Println("Large Number:", largeNumber)
}

دو نوع دیگر از اعداد صحیح با نام int و uint وجود دارند که اندازه آنها بستگی به معماری سیستمی دارد که برنامه روی آن اجرا میشود.

در سیستم های ۳۲ بیتی اندازه int و uint برابر با ۳۲ بیت و در سیستم های ۶۴ بیتی اندازه آنها برابر با ۶۴ بیت خواهد بود.

نوع int به صورت پیش‌فرض برای اعداد صحیح در Go مورد استفاده قرار میگیرد.

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    var a int = 42
    var b int32 = 42

    fmt.Println("Value of a:", a)
    fmt.Println("Size of a (int):", unsafe.Sizeof(a), "bytes") // اندازه در بایت
    fmt.Println("Value of b:", b)
    fmt.Println("Size of b (int32):", unsafe.Sizeof(b), "bytes") // اندازه در بایت
}

در اینجا از پکیج unsafe برای اندازه گیری میزان حافظه هرکدام از متغیرها استفاده کردیم.

  1. اگر برنامه بالا را در یک سیستم 64 بیتی اجرا کنید، اندازه a برابر با 8 بایت (64 بیت) خواهد بود، در حالی که اندازه b همیشه برابر با 4 بایت (32 بیت) است. 
  2. اگر برنامه بالا را در یک سیستم 32 بیتی اجرا کنید، اندازه a برابر با 4 بایت (32 بیت) خواهد بود، در حالی که اندازه b همچنان 4 بایت (32 بیت) است. 

این تفاوت‌ نشان می‌دهد که چرا ممکن است در برخی موارد بخواهید از اندازه دقیق اطمینان حاصل کنید، به ویژه در کاربردهایی که نیاز به ثبات و پیش‌بینی‌پذیری اندازه داده‌ها دارند.

اعداد اعشاری نیز به دو حالت ۳۲ و ۶۴ بیتی وجود دارند. در حالت ۳۲ بیتی تا ۷ رقم اعشار و در حالت ۶۴ بیتی تا ۱۶ رقم اعشار را میتوان ذخیره کرد.

در صورتی که اندازه حافظه را مشخص نکنیم به صورت پیش فرض عدد اعشاری به صورت ۶۴ بیتی در حافظه ذخیره می شود.

package main

import "fmt"

func main() {
	// floating point numbers: float32 float64
    var height float32 = 175.05
    var weight float64 = 78.579

    fmt.Println("Height:", age)
    fmt.Println("Weight:", weight)
}

نکته: در حالت اعشاری, اعداد به صورت تقریبی ذخیره میشوند و به دلیل تقریبی بودن, برای محاسبات مهم که نیازمند دقت بالا هستند مناسب نیستند و ممکن است منجر به نتایج غیر قابل پیش بینی شوند.

package main

import "fmt"

func main() {
	var (
		a float64 = 0.1
		b float64 = 0.2
		c float64 = 0.3
	)

	if a+b == c {
		fmt.Println("a + b is equal to c")
	} else {
		fmt.Println("a + b !is not equal to c")
	}

	fmt.Printf("a + b = %.20f\n", a+b)
	fmt.Printf("c = %.20f\n", c)

	// output:
	// a + b is not equal to c
	// a + b = 0.30000000000000004441
	// c = 0.29999999999999998890
}

در مثال بالا انتظار داریم که نتیجه حاصل از جمع کردن دو مقدار a و b برابر با c شود, اما این اتفاق نمی افتد.

در گولنگ از اعداد مختلط (Complex Numbers) نیز پشتیبانی میشود. اعداد مختلط در دو حالت ۶۴ و ۱۲۸ بیتی وجود دارند.

  • complex64: اعداد مختلط با قسمت حقیقی و موهومی از نوع float32
  • complex128: اعداد مختلط با قسمت حقیقی و موهومی از نوع float64

برای تعریف اعداد مختلط میتوان از تابع complex استفاده کرد یا اینکه قسمت موهومی را با علامت + و پسوند i از قسمت حقیقی جدا کرد.

x := 4 + 3i
y := complex(4, 3)

در صورتی که اندازه حافظه را مشخص نکنیم (مانند مثال بالا) به صورت پیش فرض complex128 مورد استفاده قرار میگیرد.

برای دسترسی به بخش حقیقی و موهومی نیز به ترتیب از real و imag استفاده میکنیم:

package main

import "fmt"

func main() {
    var complexNum complex128 = complex(1.0, 2.0)

    fmt.Println("Complex Number:", complexNum)
    fmt.Println("Real Part:", real(complexNum))
    fmt.Println("Imaginary Part:", imag(complexNum))

	// output:
	// Complex Number: (1+2i)
	// Real Part: 1
	// Imaginary Part: 2    
}

نوع‌ بولی (boolean type): نوع داده بولی که فقط دو مقدار true یا false را می‌پذیرد.

package main

import "fmt"

func main() {
    var isStudent bool = true
    fmt.Println("Is Student:", isStudent)
}

نوع‌ رشته‌ای (string type): این نوع داده برای ذخیره متن مورد استفاده قرار میگیرد.

package main

import "fmt"

func main() {
    var name string = "John Doe"
    fmt.Println("Name:", name)
}

رشته‌ها بخش مهمی از هر زبان برنامه‌نویسی هستند و در Go نیز ابزارهای متعددی برای کار با آن‌ها وجود دارد که در بخش های بعدی به صورت مفصل تری به آنها خواهیم پرداخت.

جمع بندی

در این بخش با نوع داده های اصلی (عدد, بولین و رشته ای) آشنا شدید. متوجه شدید که اعداد در سه نوع اعشاری, صحیح و مختلط وجود دارن و همچنین میتوان سایز متغیر را نیز در هنگام تعریف آن مشخص کرد.