1.5 متغیرها و constant

1.5 متغیرها و constant

1.5.1 متغیر (Variable) #

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

تعریف یک متغیر رشته #

package main

import (
	"fmt"
)

func main() {
	var s string = "Hello World"
	fmt.Println(s)
}
  1. یک متغیر با استفاده از کلید واژه var ایجاد کردیم.
  2. نام متغیر را s گذاشتیم.
  3. تایپ متغیر را از نوع string تعیین کردیم.
  4. سپس با عملگر = مقدار متغیر را مشخص از نوع رشته تعیین کردیم.
  5. رشته "Hello World" به عنوان مقدار متغیر s است و این مقدار در خانه مشخصی از حافظه قرار داده شده است.
  6. از پکیج استاندارد fmt برای چاپ مقدار متغیر s استفاده کردیم که این پکیج یکسری توابع جهت انجام عملیات‌های مختلفی نظیر چاپ مقادیر را دارد که در کد بالا ما از تابع Println استفاده کردیم.

1.5.1.1 اختصاص مقدار جدید به متغیر از قبل ایجاد شده #

در کد زیر ما یک متغیر از قبل تعریف کردیم و مقدار جدید را در خط ۹ به متغیر اختصاص دادیم.

package main

import (
	"fmt"
)

func main() {
	var s string
	s = "Hello World"
	fmt.Println(s)
}
زمانی که شما یک متغیر بصورت var s string تعریف می‌کنید مقدار پیش‌فرض "" برای متغیر تعیین شده است.

1.5.1.2 اختصاص مقدار رشته به تایپ اشتباه #

package main

import (
	"fmt"
)

func main() {
	var i int
	i = "One"
	fmt.Println(i)
}

در کد بالا ما یک متغیر از نوع int تعریف کردیم و در خط ۹ مقدار "One" را به آن تخصیص دادیم و پس از اجرا با خطای cannot use "One" (type string) as type int in assignment مواجه شدیم. این خطا یعنی اینکه شما یک مقدار رشته را به تایپ اشتباه اختصاص داده‌اید.

1.5.1.3 تعریف متغیر به صورت خلاصه #

زبان گو علاوه بر اینکه از کلید واژه var برای تعریف متغیر پشتیبانی می‌کند, از =: به انگلیسی short variable declaration نیز برای تعریف متغیرها پشتیبانی می‌کند. شما می‌توانید یک متغیر تعریف کنید و نیازی به مشخص کردن تایپ متغیر نیست، چون زبان گو بر اساس مقدار تعیین شده تایپ متغیر را تشخیص می‌دهد.

package main

import "fmt"

func main() {
	s := "Hello World"
	fmt.Println(s)
}

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

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

package main

import ( “fmt” )

var s string = “Hello World”

func main() { fmt.Println(s) }

1.5.1.4 تعریف چند متغیر در یک خط #

در زبان گو شما می‌توانید همزمان چند متغیر را در یک خط تعریف کنید که در زیر یک نمونه کد مثال زدیم :

package main

import "fmt"

func main() {
	a, b, c := "hello", 1, 1.5
	var d, e, f = "world", 13, 24
	fmt.Println(a, b, c, d, e, f)
}

1.5.1.5 تعریف متغیر با مقدار پیش‌فرض #

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

package main

import "fmt"

func main() {
   var i int
   var f float32
   var b bool
   var s string
   fmt.Printf("%v %v %v %q\n", i, f, b, s) //0 0 false ""
}

1.5.2 مقدار ثابت (Constant) #

ثابت (Constant)‌ها بر خلاف متغیر‌ها که با کلید واژه var تعریف می‌شود, با کلید واژه const تعریف می‌شوند با این تفاوت که ثابت‌ها در طول اجرای کد مقدارشان غیرقابل تغییر هست به انگلیسی Immutable, و تضمین می‌کنند هیچ چیزی در طول اجرای برنامه, باعث تغییر مقدار ثابت نشود.

package main

import (
	"fmt"
)

const s string = "Hello World"

func main() {
	fmt.Println(s)
}

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

package main

func main() {
    const a int = 8
    a = 9
}

1.5.2.1 تعریف Constant بدون نیاز به تعیین تایپ #

در تعریف ثابت‌ها همانند متغیر ها شما می‌توانید یک ثابت بدون تعیین تایپ تعریف کنید و زبان گو در زمان اجرا با توجه به مقدار اختصاص داده شده به ثابت شما, تایپ را تشخیص می دهد.

const a = 1       //Default hidden type is int
const b = "circle"   //Default hidden type is string
const c = 5.4     //Default hidden type is float64
const d = true       //Default hidden type is bool
const e = 'a'        //Default hidden type is rune
const f = 3+5i      //Default hidden type is complex128

1.5.3 نحوه مشاهده تایپ متغیر یا Constant #

در مثال زیر ما با استفاده از یکی از توابع پکیج fmt نوع و مقدار متغیر یا ثابت ها را چاپ کردیم.

package main

import "fmt"

// Named untyped constant
const a = 123      //Default hidden type is int
const b = "circle" //Default hidden type is string
const c = 5.6      //Default hidden type is float64
const d = true     //Default hidden type is bool
const e = 'a'      //Default hidden type is rune
const f = 3 + 5i   //Default hidden type is complex8

var u = 123      //Default hidden type is int
var v = "circle" //Default hidden type is string
var w = 5.6      //Default hidden type is float64
var x = true     //Default hidden type is bool
var y = 'a'      //Default hidden type is rune
var z = 3 + 5i   //Default hidden type is complex128

func main() {
	fmt.Println("")
	fmt.Printf("Type: %T Value: %v\n", a, a)
	fmt.Printf("Type: %T Value: %v\n", b, b)
	fmt.Printf("Type: %T Value: %v\n", c, c)
	fmt.Printf("Type: %T Value: %v\n", d, d)
	fmt.Printf("Type: %T Value: %v\n", e, e)
	fmt.Printf("Type: %T Value: %v\n", f, f)

	fmt.Printf("Type: %T Value: %v\n", u, u)
	fmt.Printf("Type: %T Value: %v\n", v, v)
	fmt.Printf("Type: %T Value: %v\n", w, w)
	fmt.Printf("Type: %T Value: %v\n", x, x)
	fmt.Printf("Type: %T Value: %v\n", y, y)
	fmt.Printf("Type: %T Value: %v\n", z, z)
}

1.5.3.1 استفاده از iota در constant #

شناسه iota فقط با ثابت‌ها قابل استفاده است و با آن می‌توانید اعداد auto increment ایجاد کنید.

ایجاد auto increment بدون iota :

const (
    a = 0
    b = 1
    c = 2
)

ایجاد auto increment با iota :

const (
    a = iota // 0
    b // 1
    c // 2
)
توجه کنید مقدار پیش‌فرض iota صفر, و ثابت ما از نوع int است.

1.5.3.2 نحوه ایجاد enum #

از iota و ثابت برای ایجاد enum ها هم می‌توان استفاده کرد که در مثال زیر یک نمونه کد برای ایجاد enum را نیز قرار داده‌ایم.

package main

import "fmt"

type Size uint8

const (
	small Size = iota
	medium
	large
	extraLarge
)

func main() {
	fmt.Println(small)
	fmt.Println(medium)
	fmt.Println(large)
	fmt.Println(extraLarge)
}

1.5.3.3 نادیده گرفتن مقدار اول iota #

وقتی که داریم از iota استفاده می‌کنیم شاید هنگام استفاده از auto increament نیاز باشد مقدار اول را نادیده بگیریم. برای اینکار می‌توان از _ استفاده کرد به شکل زیر :

const (
    _ = iota // ignore
    a // 1
    b // 2
    c // 3
)

1.5.3.4 خودآزمون iota #

خروجی کد زیر را در ذهن محاسبه کنید و با اجرای کد صحت آن را بررسی کنید.

package main

import "fmt"

func main() {
	const (
		A = iota
		B
		C
		D = B + C
		E
		F
		G = iota
		H
		I = H
		J
		K
	)
	fmt.Println(A, B, C, D, E, F, G, H, I, J, K)
}

1.5.4 قوانین نام‌گذاری متغیر و constant #

در زیر ما یکسری قوانین جهت نام‌گذاری متغیر و تابت‌ها تعریف کرده‌ایم :

  • نام متغیر یا ثابت باید با یک حرف انگلیسی یا _ شروع شود.
  • نام‌ها می‌توانند ترکیبی از اعداد و حروف انگلیسی یا _ باشد.
  • زبان گو به حروف بزرگ و کوچک در نام ها حساس است و اگر شما hello یا Hello را تعریف کنید, ۲ متغیر یا ثابت متفاوت محسوب می‌شوند.
  • محدودیتی در تعداد حروف نام‌ها وجود ندارد ولی بهتر است از یک تعداد مطلوب و مشخصی برای نام‌ها استفاده کنید.

توجه داشته باشید اصولا اسم ثابت‌ها را با حروف بزرگ و خارج از توابع تعریف می‌کنند.

  • با تعریف کردن ثابت‌ها با حروف بزرگ, هنگام استفاده مشخص‌تر خواهند بود.
  • از آنجایی که ثابت‌ها فقط امکان read یا همان خواندن را می‌دهند ممکن است در قسمت‌های مختلف به آن مقادیر نیاز داشته باشیم.
  • به دلیل اینکه با هر بار فراخوانی تابع, کامپایلر عملیات مقدار دهی ثابت را دوباره انجام می‌دهد, بهتر است آن را خارج از تابع تعریف کنیم.