برنامه نویسی

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.
  • معیارهای زمان واقعی و ورود به سیستم برای بینش های عملی.

مقیاس پذیری بی دردسر و عملکرد بالا

  • مقیاس خودکار برای رسیدگی به همزمانی بالا با سهولت.
  • صفر سربار عملیاتی – فقط روی ساختمان تمرکز کنید.

در اسناد بیشتر کاوش کنید!

Leapcell را امتحان کنید

ما را در X دنبال کنید: LeapCellHQ


در وبلاگ ما بخوانید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا