ویرگول
ورودثبت نام
Roham
Rohamپیدا کردن خودم توی نوشته ها برام جذابه بهم یه حس خوب بودن می ده مخصوصا وقتی با طعم علم و خلاقیت همراه باشه هر روز که بیشتر با این دنیا آشنا می شم حس بهتری برای بیشتر دونستن و یاد دادن درونم رشد می کنه
Roham
Roham
خواندن ۳ دقیقه·۱۶ روز پیش

آشنایی کامل با Struct در زبان Go

Struct در Go ابزاری برای تعریف نوع داده‌ای سفارشی است
Struct در Go ابزاری برای تعریف نوع داده‌ای سفارشی است

راهنمای کاربردی برای توسعه‌دهندگان Go

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

در این مقاله با مفهوم Struct، کاربردها، بهترین الگوهای طراحی و نکات پیشرفته آن آشنا می‌شویم.


Struct چیست؟

Struct در Go یک نوع داده ترکیبی است که از چندین فیلد تشکیل می‌شود. هر فیلد دارای یک نام و یک نوع است. تعریف یک Struct معمولاً زمانی استفاده می‌شود که بخواهیم داده‌های مرتبط را در یک واحد منطقی گروه‌بندی کنیم.

مثال ساده تعریف Struct:

type User struct { Name string Age int Email string }

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


ایجاد یک نمونه (Instance) از Struct

برای ساخت نمونه‌ای از Struct می‌توان از روش‌های مختلفی استفاده کرد.

۱. استفاده مستقیم از مقداردهی ساختاری

u := User{ Name: "Ali", Age: 30, Email: "ali@example.com", }

۲. بدون مقداردهی اولیه

var u User u.Name = "Sara" u.Age = 25 u.Email = "sara@example.com"

۳. استفاده از اشاره‌گر به Struct

u := &User{ Name: "Reza", }

با استفاده از اشاره‌گر، دسترسی به فیلدها همچنان با u.Name امکان‌پذیر است و نیازی به (*u).Name نیست؛ Go به صورت خودکار dereference انجام می‌دهد.


توابع و متدها برای Struct

Go از متدهای متصل به Struct پشتیبانی می‌کند. این قابلیت یکی از جایگزین‌های کلاس در زبان Go محسوب می‌شود.

نمونه یک متد روی Struct:

func (u User) Info() string { return fmt.Sprintf("%s (%d years old)", u.Name, u.Age) }

تفاوت Receiver مقداری و اشاره‌گری

  • Receiver مقداری: یک کپی از Struct دریافت می‌شود.

  • Receiver اشاره‌گری: تغییرات روی نمونه اصلی اعمال می‌شود.

مثال با pointer receiver:

func (u *User) IncreaseAge() { u.Age++ }

Anonymous Struct (ساختارهای بی‌نام)

گاهی نیاز نیست Struct را با نام مشخص تعریف کنیم.

user := struct { Name string Age int }{ Name: "Hasan", Age: 40, }

این روش معمولاً برای تست‌ها یا ساخت داده‌های موقت استفاده می‌شود.


Embedding در Struct (ترکیب به‌جای وراثت)

Go از وراثت پشتیبانی نمی‌کند، اما از ترکیب (Composition) استفاده می‌کند. با Embedding یک Struct در Struct دیگر، فیلدها و متدهای Struct داخلی در Struct بیرونی قابل استفاده می‌شوند.

type Address struct { City string Phone string } type Employee struct { Name string Address }

اکنون:

e := Employee{Name: "Maryam", Address: Address{City: "Tehran"}} fmt.Println(e.City)

تگ‌های Struct (Struct Tags)

Struct Tagها برای متادیتا به‌کار می‌روند و در عملیات‌هایی مانند JSON، پایگاه‌داده، API و Validation کاربرد دارند.

مثال:

type Product struct { ID int `json:"id"` Name string `json:"name"` Price int `json:"price,omitempty"` }

ویژگی omitempty باعث می‌شود فیلدهای خالی در JSON مخفی شوند.


مقایسه Struct با کلاس در زبان‌های OOP

Go کلاس ندارد، اما Struct+Methodها نقش مشابهی ایجاد می‌کنند.

ویژگیStruct در Goکلاس در زبان‌های OOPوراثتنداردداردمتدداردداردسازنده (Constructor)ندارد، اما الگوهای پیشنهادی داردداردEncapsulationنسبی با حروف بزرگ/کوچککامل توسط modifierها


الگوی متداول Constructor در Go

func NewUser(name, email string) *User { return &User{ Name: name, Email: email, Age: 0, } }

نکات پیشرفته

۱. Equality

اگر تمامی فیلدها قابل مقایسه باشند، Struct نیز قابل مقایسه است.

۲. Memory Layout

Structها به صورت contiguous در حافظه ذخیره می‌شوند، بنابراین ترتیب فیلدها در بهینه‌سازی حافظه مؤثر است.

۳. استفاده از Struct به عنوان Map Key

در صورتی که فیلدها قابل مقایسه باشند، Struct می‌تواند کلید یک Map باشد.


جمع‌بندی

Structها در Go پایه اصلی مدل‌سازی داده‌ها هستند و امکانات پیشرفته‌ای همچون متدها، ترکیب، تگ‌ها و الگوهای ساخت آبجکت را فراهم می‌کنند. استفاده درست از Structها باعث طراحی ساخت‌یافته، خوانا و توسعه‌پذیر در پروژه‌های Go می‌شود.

gostructزبان goالگوهای طراحیزبان برنامه‌نویسی
۱
۰
Roham
Roham
پیدا کردن خودم توی نوشته ها برام جذابه بهم یه حس خوب بودن می ده مخصوصا وقتی با طعم علم و خلاقیت همراه باشه هر روز که بیشتر با این دنیا آشنا می شم حس بهتری برای بیشتر دونستن و یاد دادن درونم رشد می کنه
شاید از این پست‌ها خوشتان بیاید