سرمایه گذاری متفاوت در سال نو 🍎🌱 ۳۵٪ تخفیف نوروزی ➕ حضور رایگان در مسترمایند نخبگان صنعت نرم‌افزار 💻✅
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ دانشجوی سون‌لرن
ابهام در اولویت اجرا و ورودی متد
محسن موحد حل شده توسط محسن موحد

سلام و ادب خدمت شما سوال بنده در خصوص اولیت اجرای کد و ابهاماتی هست که برایم در این جلسه به وجود امده است

 برنامه ما با دستور زیر اجرا میشود

 

newPerson(setName("my_name"), setFamily("my_family"))

 

منطقی هست که ابتد متد setName اجرا شود

سپس setFamily و خروجی این دو منجر به اجرای newPerson شود

 

حال با اجرای setName

func setName(name string) PersonOptions {
	return func(person *Person) {
		person.Name = name
	}
}

اجرا میشه اما اینجا اصلا ورودی person ای وجود ندارد

سوال بعدی در خصوص دستور
option(person)
میباشد
که به نظر میرسه منظور این است که داخلش است option نام متد هایی باشد که ما به ورودی دادیم به این صورت
setName(person)

سوال من اینجاست که چطور یکبار یک متد ورودی از جنس string دادیم
و بار دیگر ورودی از جنس person
 

سلام،

در کد newPerson(setName("my_name"), setFamily("my_family"))، چیزی که میبینید از الگوی Functional Options توی Go استفاده میکنه که یک روش استاندارده برای تنظیم آپشن‌ها. اینجا اولویت اجرا به این شکله: اول setName("my_name") و setFamily("my_family") بعنوان فانکشن‌های مستقل اجرا میشن و هر کدوم یک closure (به شکل PersonOptions که یک نوع func(*Person) هست) برمیگردونن، بدون اینکه هنوز به person نیاز داشته باشن؛ بعد این closureها به newPerson پاس داده میشن. داخل newPerson، یک نمونه از Person ساخته میشه و اون closureها روش اعمال میشن (یعنی person.Name = name اجرا میشه). اینکه میگید setName ورودی person نداره، درسته، چون اون فقط یک string میگیره و یک فانکشن میسازه؛ خود person بعداً داخل newPerson بهش پاس داده میشه. این تفاوت نوع ورودی (string به setName و *Person به closure) عمدی هست و بخشی از طراحی این الگوست که انعطاف‌پذیری و تمیزی کد رو بالا میبره.

بهترین پاسخ
محسن موحد ۱۳ اسفند ۱۴۰۳، ۰۷:۱۴