ساختار (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) پرانتزها را قرار میدهیم و در صورتی که متد به آرگومان هم نیاز داشت در داخل پرانتز آنها را مینویسیم.