ساختار (Struct)

ساختارها یا struct انواع داده‌ای هستند که توسط کاربر تعریف می‌شوند (user-define) و می‌توانند دارای فیلد و متد باشند. با ساختارها می‌توان نوع داده‌ای خیلی سفارشی ایجاد کرد. فرض کنید می‌خواهیم داده‌ای ایجاد کنیم که نه تنها نام شخص را ذخیره کند بلکه سن و حقوق ماهیانه او را نیز در خود جای دهد. برای تعریف یک ساختار به صورت زیر عمل می‌کنیم :

type StructName struct 
{
   member1
   member2
   member3
   ...
   member4
}

برای تعریف ساختار از کلمه کلیدی struct استفاده می‌شود. برای نامگذاری ساختارها از روش نامگذاری struct استفاده می‌شود. اعضا در مثال بالا (member1-5) می‌توانند متغیر باشند یا متد. در زیر مثالی از یک ساختار آمده است :

  1: package main
  2: 
  3: import "fmt"
  4: 
  5: type Employee struct {
  6:     name   string
  7:     age    int
  8:     salary float32
  9: }
 10: 
 11: func main() {
 12:     var employee1 Employee
 13:     var employee2 Employee
 14: 
 15:     employee1.name   = "Jack"
 16:     employee1.age    = 21
 17:     employee1.salary = 1000
 18: 
 19:     employee2.name   = "Mark"
 20:     employee2.age    = 23
 21:     employee2.salary = 800
 22: 
 23:     fmt.Println("Employee 1 Details")
 24:     fmt.Printf("Name  : %s    \n", employee1.name  )
 25:     fmt.Printf("Age   : %d    \n", employee1.age   )
 26:     fmt.Printf("Salary: $%.2f \n", employee1.salary)
 27: 
 28:     fmt.Println() //Seperator
 29: 
 30:     fmt.Println("Employee 2 Details")
 31:     fmt.Printf("Name  : %s    \n", employee2.name  )
 32:     fmt.Printf("Age   : %d    \n", employee2.age   )
 33:     fmt.Printf("Salary: $%.2f \n", employee2.salary)
 34: }
Employee 1 Details
Name  : Jack    
Age   : 21    
Salary: $1000.00 

Employee 2 Details
Name  : Mark    
Age   : 23    
Salary: $800.00 

برای درک بهتر، کد بالا را شرح می‌دهیم. در خطوط 9-5 یک ساختار تعریف شده است. همانطور که در خط 5 مشاهده می کنید ساختار با کلمه کلیدی struct تعریف می رود. نام ساختار نیز از روش نامگذاری پاسکال پیروی می‌کند. در داخل بدنه ساختار سه متغیر تعریف کرده‌ایم (8-6) ولی قبل از نام آنها از کلمه کلیدی var استفاده نکرده ایم (نباید هم این کار را بکنید). این سه متغیر مشخصات Employee (کارمند) مان را نشان می‌دهند. مثلاً یک کارمند دارای نام، سن و حقوق ماهانه می‌باشد. در خطوط 12 و 13 دو نمونه از ساختار Employee تعریف شده است. تعریف یک نمونه از ساختارها بسیار شبیه به تعریف یک متغیر معمولی است. ابتدا کلمه کلیدی var، سپس یک نام و در آخر اسم ساختاری که ایجاد کرده ایم (Employee) را می نویسیم. در خطوط 15 تا 21 به متغیرهای مربوط به هر Employee مقادیری اختصاص می‌دهید. برای دسترسی به متغیرها در خارج از ساختار، ابتدا نام ساختار را تایپ کرده و سپس علامت دات (.) و در آخر نام متغیر را می‌نویسیم.
وقتی که از عملگر دات استفاده می‌کنیم این عملگر اجازه دسترسی به اعضای مخصوص آن ساختار را به شما می‌دهد. در خطوط 24 تا 26 نشان داده شده که شما چطور می‌توانید به مقادیر ذخیره شده در هر متغیر ساختار دسترسی یابید. می‌توان به ساختار، متد هم اضافه کرد. مثال زیر اصلاح شده مثال قبل است.

  1: package main
  2: 
  3: import "fmt"
  4: 
  5: type Employee struct {
  6:     name   string
  7:     age    int
  8:     salary float32
  9: }
 10: 
 11: func (e Employee) SayThanks() {             
 12:     fmt.Printf("%s thanked you! \n", e.name)
 13: }                                           
 14: 
 15: func main() {
 16:     var employee1 Employee
 17:     var employee2 Employee
 18:     
 19:     employee1.name   = "Jack"
 20:     employee1.age    = 21
 21:     employee1.salary = 1000
 22:     
 23:     employee2.name   = "Mark"
 24:     employee2.age    = 23
 25:     employee2.salary = 800
 26:     
 27:     fmt.Println("Employee 1 Details")
 28:     fmt.Printf("Name  : %s    \n", employee1.name  )
 29:     fmt.Printf("Age   : %d    \n", employee1.age   )
 30:     fmt.Printf("Salary: $%.2f \n", employee1.salary)
 31:     employee1.SayThanks()
 32:     
 33:     fmt.Println() //Seperator
 34:     
 35:     fmt.Println("Employee 2 Details")
 36:     fmt.Printf("Name  : %s    \n", employee2.name  )
 37:     fmt.Printf("Age   : %d    \n", employee2.age   )
 38:     fmt.Printf("Salary: $%.2f \n", employee2.salary)
 39:     employee1.SayThanks()
 40: }
Employee 1 Details
Name: Jack
Age: 21
Salary: $1000.00
Jack thanked you!

Employee 2 Details
Name: Mike
Age: 23
Salary: $800.00
Mike thanked you!

در Go نمی توان یک متد در داخل ساختار ایجاد کرد. در خطوط 11 تا 13 یک متد در خارج ساختار تعریف شده است. این متد با استفاده از دستور (e Employee) بعد از کلمه کلیدی func به ساختار ارتباط داده شده است و مقدار فیلد name را گرفته و یک پیام منحصر به فرد برای هر نمونه نشان می‌دهد. برای فراخوانی متد، به جای اینکه بعد از علامت دات نام فیلد را بنویسیم، نام متد را نوشته و بعد از آن همانطور که در مثال بالا مشاهده می‌کنید (خطوط 31 و 39) پرانتزها را قرار می‌دهیم و در صورتی که متد به آرگومان هم نیاز داشت در داخل پرانتز آنها را می‌نویسیم.