Go Struct: چه اتفاقی می افتد که یک قسمت “_” اضافه کنید؟

مقدمه
در زبان برنامه نویسی GO ، ما اغلب استفاده از زیرکور را مشاهده می کنیم (_
) ، مانند استفاده از آن به عنوان یک مکان نگهدارنده برای نادیده گرفتن متغیرهای ناخواسته ، وارد کردن بسته ها صرفاً برای عوارض جانبی آنها یا نادیده گرفتن متغیرها در تبدیل نوع. با این حال ، اکثر مردم ممکن است با استفاده از یک زیرکور در یک ساختار – به طور خاص ، با تعریف یک میدان ساختاری به نام روبرو نشده باشند _
بشر
بنابراین ، هدف از تعریف چنین زمینه ای چیست؟
مقایسه کد: ساختار با و بدون تأکید (_
) زمینه
ابتدا ، بیایید به نمونه ای از ساختار بدون زیرک بپردازیم (_
) زمینه.
در model
بسته ، ما تعریف می کنیم User
ساختار با دو زمینه: Name
وت Age
بشر
type User struct {
Name string
Age int
}
ما متغیرهای ساختاری را با استفاده از هر دو هدف اولیه و نامگذاری شده در زمینه اعلام می کنیم.
user := model.User{"Alice", 18}
user = model.User{Name: "Alice", Age: 18}
در کد فوق ، هیچ مشکلی در تعریف یا اعلام ساختار وجود ندارد.
حال ، بیایید به نمونه ای بپردازیم که در آن ساختار شامل یک زیرکور (_
) زمینه:
در model
بسته ، ما تعریف می کنیم User
ساختار با سه زمینه: Name
با Age
وت _
بشر
type User struct {
Name string
Age int
_ struct{}
}
ما متغیرهای ساختاری را با استفاده از هر دو هدف اولیه و نامگذاری شده در زمینه اعلام می کنیم.
// Compilation error: too few values in struct literal of type model.User
user := model.User{"Alice", 18}
// Compilation error: implicit assignment to unexported field _ in struct literal of type model.User
user = model.User{"Alice", 18, struct{}{}}
// Valid
user = model.User{}
user = model.User{Name: "Alice", Age: 18}
در مثال بالا ، اگر متغیر ساختار را با استفاده از آن اعلام کنید user := model.User{"Alice", 18}
یا model.User{"Alice", 18, struct{}{}}
، که هر دو روش اولیه سازی موقعیت هستند ، این برنامه خطاهای تدوین را ایجاد می کند. با این حال ، با استفاده از اولیه سازی با ارزش صفر یا اولیه سازی میدان نامگذاری شده بدون مشکل کار خواهد کرد.
با مقایسه نمونه های ساختار با و بدون زیرکور (_
) زمینه ، ما می توانیم هدف از تعریف چنین زمینه ای را نتیجه بگیریم: اضافه کردن یک زمینه به نام _
در یک ساختار به طور مؤثر ، ساختار را با استفاده از اولیه سازی میدان نامگذاری شده مجبور می کند (به جز در موارد اعلامیه متغیر ساختار با ارزش صفر).
تجزیه و تحلیل مختصر از اصل
هنگامی که ما یک ساختار را با استفاده از آن اعلام می کنیم اولیه سازی موقعیت، ما باید مقادیر لازم را برای همه زمینه ها به ترتیب دقیق آنها تعریف کنیم.
اگر یک ساختار شامل زمینه ای به نام باشد _
، و ما از اولیه سازی موقعیتی استفاده می کنیم بدون اینکه مقدار برای آن تهیه کنیم _
فیلد ، کامپایلر خطایی مانند:
too few values in struct literal of type XXX
این اتفاق می افتد زیرا تمام مقادیر میدانی ارائه نشده است.
حتی اگر مقادیر همه زمینه ها را به ترتیب صحیح ارائه دهیم ، کامپایلر هنوز خطایی را به وجود می آورد:
implicit assignment to unexported field _ in struct literal of type XXX
این به این دلیل است که _
میدان با یک حرف کوچک شروع می شود و به این ترتیب در نظر گرفته می شود بدون گزارشبشر ما نمی توانیم با استفاده از اولیه سازی موقعیتی ، یک مقدار را به یک زمینه بدون گزارش اختصاص دهیم. در نتیجه ، اولیه سازی این ساختار از این طریق امکان پذیر نیست.
به طور خلاصه ، زیرا متغیرهای ساختار با یک زیربنایی (_
) زمینه را نمی توان با استفاده از اولیه سازی موقعیتی اعلام کرد ، ما فقط با دو رویکرد معتبر باقی مانده ایم: اولیه سازی با ارزش صفر یا نامگذاری شده در زمینه نامگذاری شدهبشر
پایان
از طریق این بحث ، ما در مورد استفاده ویژه از یک زیرک () آموخته ایم (_
) به عنوان یک نام فیلد در تعاریف ساختار Go.
به طور خاص ، تعریف زمینه ای به نام _
می تواند به طور مؤثر اجرای اولیه سازی میدان را اجرا کنید هنگام ایجاد نمونه هایی از ساختار ، جلوگیری از استفاده از اولیه سازی موقعیتی. مزایای این رویکرد شامل موارد زیر است:
- خوانایی کد: نامگذاری شده در زمینه اولیه ، با ارتباط صریح هر مقدار با یک نام فیلد ، خوانایی و قابلیت حفظ آن را تقویت می کند.
- پیشگیری از خطا: اولیه سازی مثبت به پیروی دقیق از نظم میدانی متکی است و آن را مستعد خطا می کند. نامگذاری شده در زمینه اولیه این خطر را از بین می برد.
ما Leapcell ، انتخاب برتر شما برای میزبانی پروژه های GO هستیم.
Leapcell بستر سرور نسل بعدی برای میزبانی وب ، کارهای ASYNC و REDIS است:
پشتیبانی چند زبانی
- با node.js ، پایتون ، برو یا زنگ زدگی توسعه دهید.
پروژه های نامحدود را به صورت رایگان مستقر کنید
- فقط برای استفاده پرداخت کنید – بدون درخواست ، بدون هزینه.
راندمان هزینه بی نظیر
- پرداخت به عنوان شما بدون هیچ گونه هزینه بیکار.
- مثال: 25 دلار از درخواست های 6.94M در زمان پاسخ متوسط 60ms پشتیبانی می کند.
تجربه توسعه دهنده ساده
- UI بصری برای راه اندازی بی دردسر.
- خطوط لوله CI/CD کاملاً خودکار و ادغام GITOPS.
- معیارهای زمان واقعی و ورود به سیستم برای بینش های عملی.
مقیاس پذیری بی دردسر و عملکرد بالا
- مقیاس خودکار برای رسیدگی به همزمانی بالا با سهولت.
- صفر سربار عملیاتی – فقط روی ساختمان تمرکز کنید.
در اسناد بیشتر کاوش کنید!
ما را در X دنبال کنید: LeapCellHQ
در وبلاگ ما بخوانید