1. متغیرها و ثابت‌ها

در Golang، متغیرها و ثابت‌ها دو مفهوم بنیادی هستند که نقش بسیار مهمی در یک برنامه ایفا می‌کنند.

  • یک متغیر یک شناسه نام‌گذاری شده است که برای ذخیره داده در یک برنامه استفاده می‌شود. در Golang از کلمه کلیدی var برای اعلان متغیرها استفاده می‌شود.
  • یک ثابت یک شناسه است که مقدار آن نمی‌تواند در برنامه تغییر کند. در Golang از کلمه کلیدی const برای اعلان ثابت‌ها استفاده می‌شود.

2 اعلان و مقداردهی اولیه متغیرهای Golang

2.1 اعلان و اختصاص یک متغیر تکی

در زبان Go، کلمه کلیدی var برای اعلان یک متغیر با فرمت var نام_متغیر نوع استفاده می‌شود. پس از اعلان، مقدار متغیر می‌تواند در کد‌های بعدی اختصاص داده شود یا می‌تواند در زمان اعلان به طور مستقیم مقداردهی اولیه شود. به عنوان مثال:

var age int // یک متغیر صحیح به نام age اعلان می‌شود
age = 25    // مقداری به متغیر اختصاص داده می‌شود

var name string = "Alice" // متغیر نام اعلان و مقداردهی اولیه می‌شود

2.2 اعلان متغیرهای چندگانه

زبان Go از اعلان همزمان متغیرهای چندگانه پشتیبانی می‌کند که می‌تواند کد را مختصرتر کند. اعلان دسته‌ای معمولاً در ابتدای یک تابع یا در سطح بسته انجام می‌شود. به عنوان مثال:

var (
    firstName, lastName string
    age                 int
)

firstName = "John"
lastName = "Doe"
age = 30

در اعلان دسته‌ای بالا، firstName و lastName به عنوان رشته‌ها اعلان شده‌اند، در حالی که age یک عدد صحیح است.

2.3 استنباط نوع و اعلان متغیر کوتاه

در زبان Go، اغلب لازم نیست نوع متغیر را به طور صریح مشخص کنیم. اگر یک عبارت مقداردهی اولیه را هنگام اعلان یک متغیر فراهم کنیم، Go می‌تواند نوع متغیر را استنباط کند. این به عنوان استنباط نوع شناخته می‌شود. اعلان متغیر کوتاه با استفاده از := می‌تواند عبارت اعلان و مقداردهی اولیه متغیرها براساس استنباط نوع را ساده‌تر کند. به عنوان مثال:

city := "تهران" // استفاده از اعلان متغیر کوتاه برای همزمان اعلان و مقداردهی اولیه city
country := "ایران" // نوع country به عنوان یک رشته استنباط می‌شود

لازم به ذکر است که اعلان متغیرهای کوتاه فقط می‌تواند درون توابع استفاده شود و نمی‌تواند در یک دامنه جهانی استفاده شود.

2.4 اعلان متغیر در خارج از توابع

متغیرهای اعلان شده خارج از توابع دامنه بسته‌ای دارند. این متغیرها در سراسر بسته قابل مشاهده و دسترسی هستند. به عنوان مثال:

var globalVar string = "من دارم گلوبالم" // اعلان یک متغیر جهانی

func printGlobalVar() {
    fmt.Println(globalVar) // دسترسی به متغیر جهانی در داخل تابع
}

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

نکته: درک کد تابع پایه اینجا کافی است، توضیحات دقیق درباره توابع در بخش‌های بعدی ارائه خواهد شد.

3 انواع داده‌ای پایه و مقدارهای صفر

3.1 انواع داده‌ای پایه در Golang

در زبان Go، هر نوع متغیر ویژگی‌ها و رفتارهای صریحی را فراهم می‌کند. اینجا چندین نوع داده‌ای پایه رایج آمده است:

  • int، int8، int16، int32، int64: دامنه‌های مختلف اعداد صحیح
  • uint، uint8، uint16، uint32، uint64: اعداد صحیح بدون علامت
  • float32، float64: اعداد ممیز شناور
  • bool: مقادیر منطقی (صحیح یا غلط)
  • string: رشته‌ها

3.2 مفهوم مقدار صفر

در زبان Go، متغیرها پس از اعلان به طور خودکار به مقدار صفر نوع خود مقداردهی اولیه می‌شوند. مقدار صفر به مقدار پیش‌فرض نوع متناظر زمانی که یک متغیر به طور صریح مقداردهی نشده است، اشاره دارد. این در برخی زبان‌های دیگر رایج نیست، اما در Go، اطمینان حاصل می‌شود که همه متغیرها همیشه یک مقدار اولیه معتبر دارند. در زیر مقادیر صفر برای هر نوع داده‌ای پایه آورده شده است:

  • مقدار صفر برای یک عدد صحیح 0 است
  • مقدار صفر برای یک عدد ممیز شناور 0.0 است
  • مقدار صفر برای یک مقدار منطقی false است
  • مقدار صفر برای یک رشته رشته خالی "" است

به عنوان مثال:

var i int     // مقدار صفر برابر با 0 است
var f float64 // مقدار صفر برابر با 0.0 است
var b bool    // مقدار صفر برابر با false است
var s string  // مقدار صفر برابر با "" است

درک مفهوم مقادیر صفر بسیار مهم است، زیرا می‌تواند به توسعه‌دهندگان کمک کند تا رفتار مقداردهی اولیه متغیر را درک کنند و می‌تواند برای جلوگیری از خطاهای نشانگر تهی یا مقادیر ناپیش‌فرض استفاده شود.

4. دامنه متغیرها

4.1 متغیر‌های محلی

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

func localVariableExample() {
    var localVariable int = 10 // این یک متغیر محلی است
    fmt.Println(localVariable)
}

func main() {
    localVariableExample() // خروجی: 10
    // fmt.Println(localVariable) // این باعث خطای کامپایل می‌شود چون متغیر محلی در اینجا قابل مشاهده نیست
}

در مثال بالا، localVariable تنها در داخل تابع localVariableExample قابل دسترسی است.

4.2 متغیرهای سراسری

متغیرهای سراسری، متغیرهایی هستند که خارج از توابع تعریف شده‌اند و می‌توان در هر فایل داخل همان بسته به آنان دسترسی داشت. اگر می‌خواهید از متغیرهای سراسری در بسته‌های دیگر استفاده کنید، نام متغیر باید با یک حرف بزرگ شروع شود، به تطابق با قوانین کنترل دسترسی Go.

package main

import "fmt"

var globalVariable int = 20 // این یک متغیر سراسری است

func main() {
    fmt.Println(globalVariable) // خروجی: 20
    changeGlobal()
    fmt.Println(globalVariable) // خروجی: 30
}

func changeGlobal() {
    globalVariable = 30 // تغییر مقدار متغیر سراسری
}

در این مثال، globalVariable در هر دو تابع main و changeGlobal قابل مشاهده است.

5 اعلان و استفاده از ثابت‌ها

5.1 واژه کلیدی const

ما از واژه کلیدی const برای تعریف ثابت‌ها استفاده می‌کنیم. ثابت‌ها، مقادیری هستند که قابلیت تغییر ندارند و به یک بار تعریف شود، مقدار آنان قابل تغییر نیست. ثابت‌ها می‌توانند از هر نوع داده ابتدایی نظیر اعداد صحیح، اعداد اعشاری ممیز شناور، بولی‌ها یا رشته‌ها باشند.

const Pi = 3.14 // تعریف یک ثابت ممیز شناور
const StrConst string = "سلام، دنیا!" // تعریف یک ثابت رشته‌ای

func main() {
    fmt.Println(Pi)
    fmt.Println(StrConst)
}

5.2 ثوابت شمارشی

زبان Go نوع مشخصی برای شمارش‌ها ندارد، اما می‌توانید از واژه کلیدی iota برای دست‌یابی به شمارش استفاده کنید. در داخل بلاک const، هر اظهار ثابت جدید باعث افزایش مقدار iota به اندازه 1 می‌شود.

const (
    Sunday = iota  // 0
    Monday         // 1
    Tuesday        // 2
    Wednesday      // 3
    Thursday       // 4
    Friday         // 5
    Saturday       // 6
)

func main() {
    fmt.Println(Sunday)    // خروجی: 0
    fmt.Println(Saturday)  // خروجی: 6
}

کد فوق شمارشی برای روزهای هفته را اعلان می‌کند، جایی که iota در داخل بلاک const با مقدار 0 مقداردهی اولیه می‌شود و به اندازه 1 برای هر اظهار ثابت جدید افزایش می‌یابد.

5.3 دامنه‌ی ثابت‌ها

دامنه‌ی ثابت‌ها شبیه متغیرها است. اگر یک ثابت داخل یک تابع تعریف شود، دامنه‌اش تا آن تابع محدود است. اگر یک ثابت بیرون یک تابع (سراسری) تعریف شود، دامنه‌اش کل بسته است، و اگر حرف اول آنان بزرگ باشد، می‌توان در بسته‌های دیگر به آنها دسترسی پیدا کرد.

مدیریت دامنه‌ی ثابت‌ها کمک می‌کند دامنه‌ی سراسری کل ابرگنجایش کم شود و قابلیت دستیابی و خوانایی برنامه را بهبود بخشد.

const GlobalConst = "این یک ثابت سراسری است"

func main() {
    const LocalConst = "این یک ثابت محلی است"
    fmt.Println(GlobalConst)  // این معتبر است
    fmt.Println(LocalConst)   // این معتبر است
}

func anotherFunction() {
    // fmt.Println(LocalConst) // این باعث خطای کامپایل می‌شود: LocalConst در این تابع قابل مشاهده نیست
    fmt.Println(GlobalConst)  // این معتبر است
}

در این مثال، LocalConst تنها در داخل تابع main قابل دسترسی است، درحالیکه GlobalConst در سراسر کل بسته قابل دسترسی است.