محدوده متغیر

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

package main

import "fmt"

func DemonstrateScope() {
    var number int = 5

    fmt.Printf("number inside method DemonstrateScope() = %d \n", number)
}

func main() {
    var number int = 10

    DemonstrateScope();

    fmt.Printf("number inside the Main method = %d", number)
}
number inside method DemonstrateScope() = 5
number inside the Main method = 10

مشاهده می‌کنید که حتی اگر ما دو متغیر با نام یکسان تعریف کنیم که دارای محدوده‌های متفاوتی هستند، می‌توان به هر کدام از آنها مقادیر مختلفی اختصاص داد. متغیر تعریف شده در داخل متد ()main هیچ ارتباطی به متغیر داخل متد ()DemonstrateScope ندارد. GO دارای دو محدوده است:

  • متغیرهای محلی (Local)
  • متغیرهای سراسری (Global)

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

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

  1: package main
  2: 
  3: import "fmt"
  4: 
  5: func localVariable() {
  6:     var number int = 10
  7:     fmt.Println(number)
  8: }
  9: 
 10: func main() {
 11:     localVariable()
 12:     fmt.Println(number)
 13: }

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

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

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

  1: package main
  2: 
  3: import "fmt"
  4: 
  5: var number1 int = 10
  6: var number2 int = 5
  7: var sum     int
  8: 
  9: func globalVariable(){
 10:     sum = number1 + number2
 11: }
 12: 
 13: func main() {
 14:     globalVariable()
 15:     fmt.Println(sum)
 16: }
15

همانطور که در کد بالا مشاهده می کنید، متغیرهایی که در خطوط 6-5 تعریف شده اند در داخل تمامی متدهای برنامه قابل دسترسی هستند. مثلا در خط 10 مقدار دو متغیر number1 و number2 با هم جمع و در داخل متغیر sum قرار داده شده است. حال همین متغیر sum که در خارج از متد ()main تعریف شده است، قابل دسترسی و دارای مقدار 15 می باشد.