Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 ✅proto? 🔴https://t.me/gopher_academy/627 ✅Defining A Message Type 🔴 https://t.me/gopher_academy/628 ✅Assigning Field Numbers 🔴https://t.me/gopher_academy/629 ✅Adding Comments 🔴 https://t.me/gopher_academy/630 ✅Reserved Fields…
🔴What's Generated From Your .proto?🔴
زمانی که شما فایل proto رو برای زبان خاصی جنریت می کنید - برای هر زبان یه سری فایل های دیگه ای رو جنریت می کند
✅برای C ++ یه فایل .h و .cc تولید می کند ، با یک کلاس برای هر نوع پیام که در پرونده شما توصیف شده است.
✅برای java ، یک فایل .java با کلاس برای هر نوع پیام و همچنین کلاسهای Builder ویژه برای ایجاد نمونه های کلاس پیام ایجاد می کند.
✅برای python کمی متفاوت است - پایتون یک ماژول با توصیف کننده ایستا از هر نوع پیام در .proto شما ایجاد می کند ، سپس با یک کلاس بزرگ برای ایجاد کلاس دسترسی به داده های لازم پایتون در زمان اجرا استفاده می شود.
✅برای Go ، یک فایل .pb.go برای هر نوع پیام در پرونده شما ایجاد می کند.
✅برای Ruby ، یک فایل .rb با ماژول Ruby شامل انواع پیام های شما تولید می کند.
✅برای Objective-C ، از هر .proto ، یک فایل pbobjc.h و pbobjc.m تولید می کند ، با یک کلاس برای هر نوع پیام که در پرونده شما توصیف شده است.
✅برای C # ، از هر .proto یک فایل .cs تولید می کند ، با یک کلاس برای هر نوع پیام توصیف شده در پرونده شما.
✅برای dart ، برای هر نوع پیام در پرونده شما ، یک فایل .pb.dart با کلاس تولید می کند.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
زمانی که شما فایل proto رو برای زبان خاصی جنریت می کنید - برای هر زبان یه سری فایل های دیگه ای رو جنریت می کند
✅برای C ++ یه فایل .h و .cc تولید می کند ، با یک کلاس برای هر نوع پیام که در پرونده شما توصیف شده است.
✅برای java ، یک فایل .java با کلاس برای هر نوع پیام و همچنین کلاسهای Builder ویژه برای ایجاد نمونه های کلاس پیام ایجاد می کند.
✅برای python کمی متفاوت است - پایتون یک ماژول با توصیف کننده ایستا از هر نوع پیام در .proto شما ایجاد می کند ، سپس با یک کلاس بزرگ برای ایجاد کلاس دسترسی به داده های لازم پایتون در زمان اجرا استفاده می شود.
✅برای Go ، یک فایل .pb.go برای هر نوع پیام در پرونده شما ایجاد می کند.
✅برای Ruby ، یک فایل .rb با ماژول Ruby شامل انواع پیام های شما تولید می کند.
✅برای Objective-C ، از هر .proto ، یک فایل pbobjc.h و pbobjc.m تولید می کند ، با یک کلاس برای هر نوع پیام که در پرونده شما توصیف شده است.
✅برای C # ، از هر .proto یک فایل .cs تولید می کند ، با یک کلاس برای هر نوع پیام توصیف شده در پرونده شما.
✅برای dart ، برای هر نوع پیام در پرونده شما ، یک فایل .pb.dart با کلاس تولید می کند.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 ✅proto? 🔴https://t.me/gopher_academy/627 ✅Defining A Message Type 🔴 https://t.me/gopher_academy/628 ✅Assigning Field Numbers 🔴https://t.me/gopher_academy/629 ✅Adding Comments 🔴 https://t.me/gopher_academy/630 ✅Reserved Fields…
🔴Scalar Value Types🔴
✅احتمالا موقع نوشتن فایل پروتو گیج بشید که باید از کدوم یکی نوع مقدار استفاده کنید، برای مثال فقط برای اعداد گزینههای:
int32, int64
uint32, uint64
sint32, sint64
fixed32, fixed64
sfixed32, sfixed64
میتونید انتخاب کنید.
✅برای روشنتر شدن موضوع توصیه میکنم از لینک زیر به داکیومنت اصلی نگاهی بندازید،جدولی میبینید که توضیح کاملی از تایپ موردنظر تو زبانی که کار میکنید داره.
https://developers.google.com/protocol-buffers/docs/proto3#scalar
✅تمام مقادیر دو نوع ۳۲ بیت و ۶۴ بیت دارن.
✅تمام نوعها ممکنه بتونند اعداد منفی بگیرن یا نگیرن. (Signed/Unsigned)
✅تمام این تایپها موقع کامپایل تبدیل به تایپ قابل فهم برای زبانهای برنامه شما میشن، پس حتما از جدول این صفحه استفاده کنید.
✅درک این تایپها کمک میکنه تا برنامهای با پرفورمنس بالا بنویسید.👇🏻
✅تایپ int32 و sint32 میتونه مقادیر -۲،۱۴۷،۴۸۳،۶۴۸ تا ۲،۱۴۷،۴۸۳،۶۴۷ در خودش ذخیره کنه
✅تایپ uint32 میتونه مقادیر ۰ تا ۴،۲۹۴،۹۶۷،۲۹۵ در خودش ذخیره کنه.
✅تایپ int64 و sint64 میتونه مقادیر -۹،۲۲۳،۳۷۲،۰۳۶،۸۵۴،۷۷۵،۸۰۸ تا ۹،۲۲۳،۳۷۲،۰۳۶،۸۵۴،۷۷۵،۸۰۷ در خودش ذخیره کنه.
✅تایپ uint64 میتونه مقادیر ۰ تا ۱۸،۴۴۶،۷۴۴،۰۷۳،۷۰۹،۵۵۱،۶۱۵ در خودش ذخیره کنه.
✅بنابراین یادتون باشه تایپهای uint32 و uint64 یا به اصطلاح Unsigned نمیتونند مقادیر منفی در خودشون ذخیره کنند.
✅تایپهای int32 و int64 به صورت رسمی اعداد منفی قبول نمیکنند. (در این تایپ اعداد منفی فضای بیشتری اشغال میکنند)
✅تایپهای sint32 و sint64 اعداد منفی قبول میکنند. (با تکنیکی به اسم ZigZag اعداد منفی فضای کمی اشغال میکنند)
✅تایپ fixed32 همیشه ۴ بایت اشغال میکنه، اگر عددتون بزرگتر از ۲۶۸،۴۳۵،۴۵۶ بود کاراییش بهتر از uint32 هست، بهتره از این تایپ استفاده کنید.
✅تایپ fixed64 همیشه ۸ بایت اشتغال میکنه، اگر عددتون بزرگتر از ۷۲،۰۵۷،۵۹۴،۰۳۷،۹۲۷،۹۴۰ بود کاراییش بهتر از uint64 هست، بهتره از این تایپ استفاده کنید.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
✅احتمالا موقع نوشتن فایل پروتو گیج بشید که باید از کدوم یکی نوع مقدار استفاده کنید، برای مثال فقط برای اعداد گزینههای:
int32, int64
uint32, uint64
sint32, sint64
fixed32, fixed64
sfixed32, sfixed64
میتونید انتخاب کنید.
✅برای روشنتر شدن موضوع توصیه میکنم از لینک زیر به داکیومنت اصلی نگاهی بندازید،جدولی میبینید که توضیح کاملی از تایپ موردنظر تو زبانی که کار میکنید داره.
https://developers.google.com/protocol-buffers/docs/proto3#scalar
✅تمام مقادیر دو نوع ۳۲ بیت و ۶۴ بیت دارن.
✅تمام نوعها ممکنه بتونند اعداد منفی بگیرن یا نگیرن. (Signed/Unsigned)
✅تمام این تایپها موقع کامپایل تبدیل به تایپ قابل فهم برای زبانهای برنامه شما میشن، پس حتما از جدول این صفحه استفاده کنید.
✅درک این تایپها کمک میکنه تا برنامهای با پرفورمنس بالا بنویسید.👇🏻
✅تایپ int32 و sint32 میتونه مقادیر -۲،۱۴۷،۴۸۳،۶۴۸ تا ۲،۱۴۷،۴۸۳،۶۴۷ در خودش ذخیره کنه
✅تایپ uint32 میتونه مقادیر ۰ تا ۴،۲۹۴،۹۶۷،۲۹۵ در خودش ذخیره کنه.
✅تایپ int64 و sint64 میتونه مقادیر -۹،۲۲۳،۳۷۲،۰۳۶،۸۵۴،۷۷۵،۸۰۸ تا ۹،۲۲۳،۳۷۲،۰۳۶،۸۵۴،۷۷۵،۸۰۷ در خودش ذخیره کنه.
✅تایپ uint64 میتونه مقادیر ۰ تا ۱۸،۴۴۶،۷۴۴،۰۷۳،۷۰۹،۵۵۱،۶۱۵ در خودش ذخیره کنه.
✅بنابراین یادتون باشه تایپهای uint32 و uint64 یا به اصطلاح Unsigned نمیتونند مقادیر منفی در خودشون ذخیره کنند.
✅تایپهای int32 و int64 به صورت رسمی اعداد منفی قبول نمیکنند. (در این تایپ اعداد منفی فضای بیشتری اشغال میکنند)
✅تایپهای sint32 و sint64 اعداد منفی قبول میکنند. (با تکنیکی به اسم ZigZag اعداد منفی فضای کمی اشغال میکنند)
✅تایپ fixed32 همیشه ۴ بایت اشغال میکنه، اگر عددتون بزرگتر از ۲۶۸،۴۳۵،۴۵۶ بود کاراییش بهتر از uint32 هست، بهتره از این تایپ استفاده کنید.
✅تایپ fixed64 همیشه ۸ بایت اشتغال میکنه، اگر عددتون بزرگتر از ۷۲،۰۵۷،۵۹۴،۰۳۷،۹۲۷،۹۴۰ بود کاراییش بهتر از uint64 هست، بهتره از این تایپ استفاده کنید.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🔴Default Values🔴
✅چیزی که خیلی مهمه تا بدونید مقدار پیش فرض در پروتوبافه، تمام فیلدها مقدار پیشفرض دارن،
✅برای بولین مقدار false هستش،
✅برای نامبر عدد ۰ هستش،
✅برای استرینگ یک رشته خالی،
✅برای بایت یک رشته بایت خالی،
✅برای اینام (enum) اولین مقدار لیست،
✅برای آرایه یک آرایه خالی.
تمام فیلدهایی که بعد از اجرای برنامه مقدار دهی نشن، شناخته نشن و... مقدار پیشفرض رو میگیرن.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
✅چیزی که خیلی مهمه تا بدونید مقدار پیش فرض در پروتوبافه، تمام فیلدها مقدار پیشفرض دارن،
✅برای بولین مقدار false هستش،
✅برای نامبر عدد ۰ هستش،
✅برای استرینگ یک رشته خالی،
✅برای بایت یک رشته بایت خالی،
✅برای اینام (enum) اولین مقدار لیست،
✅برای آرایه یک آرایه خالی.
تمام فیلدهایی که بعد از اجرای برنامه مقدار دهی نشن، شناخته نشن و... مقدار پیشفرض رو میگیرن.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🔴معماری سیستم استخراج و ذخیرهسازی اطلاعات زمان پخش🔴
✅ https://vrgl.ir/OXIPO
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
✅ https://vrgl.ir/OXIPO
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 ✅proto? 🔴https://t.me/gopher_academy/627 ✅Defining A Message Type 🔴 https://t.me/gopher_academy/628 ✅Assigning Field Numbers 🔴https://t.me/gopher_academy/629 ✅Adding Comments 🔴 https://t.me/gopher_academy/630 ✅Reserved Fields…
🔴Enumerations🔴
✅اگر با اینام آشنا نیستید باید بگم یک لیست از مقدایره، همونطور که بولین یک لیست دوتایی از true و false هستش، اینام میتونه یک لیست چندتایی از هر تایپی باشه.
✅اگر فراموش کردید باید دوباره بگم مقدار اول اینام میشه مقدار پیشفرض، نباید اینو فراموش کنید.
✅اینام باید از تگ ۰ شروع بشه که مقدار پیشفرض هستش.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
✅اگر با اینام آشنا نیستید باید بگم یک لیست از مقدایره، همونطور که بولین یک لیست دوتایی از true و false هستش، اینام میتونه یک لیست چندتایی از هر تایپی باشه.
✅اگر فراموش کردید باید دوباره بگم مقدار اول اینام میشه مقدار پیشفرض، نباید اینو فراموش کنید.
✅اینام باید از تگ ۰ شروع بشه که مقدار پیشفرض هستش.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
Gopher Academy
🔴Enumerations🔴 ✅اگر با اینام آشنا نیستید باید بگم یک لیست از مقدایره، همونطور که بولین یک لیست دوتایی از true و false هستش، اینام میتونه یک لیست چندتایی از هر تایپی باشه. ✅اگر فراموش کردید باید دوباره بگم مقدار اول اینام میشه مقدار پیشفرض، نباید اینو…
👆🏻نکته👆🏻
✅ثابت های enum در محدوده یک عدد صحیح 32 بیتی می باشند. از آنجا که مقادیر enum از رمزگذاری varint روی استفاده می کند ، مقادیر منفی را قبول نمی کنند .
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
✅ثابت های enum در محدوده یک عدد صحیح 32 بیتی می باشند. از آنجا که مقادیر enum از رمزگذاری varint روی استفاده می کند ، مقادیر منفی را قبول نمی کنند .
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 ✅proto? 🔴https://t.me/gopher_academy/627 ✅Defining A Message Type 🔴 https://t.me/gopher_academy/628 ✅Assigning Field Numbers 🔴https://t.me/gopher_academy/629 ✅Adding Comments 🔴 https://t.me/gopher_academy/630 ✅Reserved Fields…
🔴Using Other Message Types🔴
✅آرایهها در پروتوبافر با عنوان repeated شناخته میشن، برای مثال شاید بخوایم برای پروفایلی که داشتیم چندین شماره تلفن درنظر بگیریم، پس فایل رو به این صورت تغییر میدیم:
✅همینطور که میبینید فقط کافیه کلمه repeated قبل از تایپ فیلدمون اضافه کنیم.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
✅آرایهها در پروتوبافر با عنوان repeated شناخته میشن، برای مثال شاید بخوایم برای پروفایلی که داشتیم چندین شماره تلفن درنظر بگیریم، پس فایل رو به این صورت تغییر میدیم:
✅همینطور که میبینید فقط کافیه کلمه repeated قبل از تایپ فیلدمون اضافه کنیم.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 ✅proto? 🔴https://t.me/gopher_academy/627 ✅Defining A Message Type 🔴 https://t.me/gopher_academy/628 ✅Assigning Field Numbers 🔴https://t.me/gopher_academy/629 ✅Adding Comments 🔴 https://t.me/gopher_academy/630 ✅Reserved Fields…
🔴Nested Types🔴
✅علاوه بر اینام شما میتونید از مسیجهای دیگه داخل مسیج اصلیتون استفاده کنید، اینکار خیلی سادس، تو نمونه بالا تاریخ تولد به پروفایل کاربر اضافه میکنیم:
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
✅علاوه بر اینام شما میتونید از مسیجهای دیگه داخل مسیج اصلیتون استفاده کنید، اینکار خیلی سادس، تو نمونه بالا تاریخ تولد به پروفایل کاربر اضافه میکنیم:
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
✅بیزینس شما رشد میکنه و شما باید API هارو آپدیت کنید، بعضی فیلدها تغییر میکنند، بعضی فیلدها اضافه و بعضی حدف میشن.
✅بیاید یه سناریو درنظر بگیریم، امروز موقع ثبتنام فقط نام و نام خانوادگی دریافت میکنید، ولی بعد یه مدت به شماره تلفن کاربران نیاز پیدا میکنید. ولی شما نمیتونید در یک لحظه فایل پروتو تمام اپلیکیشنهایی که دارن از سرویس شما استفاده میکنند آپدیت کنید.
خوشبختانه پروتوبافر اینجاهم به دادمون میرسه تا بتونیم بدون دردسر به توسعه اپ ادامه بدیم، پروتوباف full compatibe هست، اگر با این مفهوم آشنا نیستید به عکس بالا نگاه کنید:
✅در سناریو یک دیتا با فایل جدید نوشته میشه ولی با فایل قدیمی خونده میشه و مشکلی پیش نمیاد.
✅در سناریو دوم دیتا با فایل قدیمی نوشته میشه ولی با فایل جدید خونده میشه که بازم مشکلی پیش نمیاد.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
✅بیاید یه سناریو درنظر بگیریم، امروز موقع ثبتنام فقط نام و نام خانوادگی دریافت میکنید، ولی بعد یه مدت به شماره تلفن کاربران نیاز پیدا میکنید. ولی شما نمیتونید در یک لحظه فایل پروتو تمام اپلیکیشنهایی که دارن از سرویس شما استفاده میکنند آپدیت کنید.
خوشبختانه پروتوبافر اینجاهم به دادمون میرسه تا بتونیم بدون دردسر به توسعه اپ ادامه بدیم، پروتوباف full compatibe هست، اگر با این مفهوم آشنا نیستید به عکس بالا نگاه کنید:
✅در سناریو یک دیتا با فایل جدید نوشته میشه ولی با فایل قدیمی خونده میشه و مشکلی پیش نمیاد.
✅در سناریو دوم دیتا با فایل قدیمی نوشته میشه ولی با فایل جدید خونده میشه که بازم مشکلی پیش نمیاد.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 ✅proto? 🔴https://t.me/gopher_academy/627 ✅Defining A Message Type 🔴 https://t.me/gopher_academy/628 ✅Assigning Field Numbers 🔴https://t.me/gopher_academy/629 ✅Adding Comments 🔴 https://t.me/gopher_academy/630 ✅Reserved Fields…
🔴Updating A Message Type🔴
✅هیچوقت نباید تگ فیلدهارو تغییر بدیم.
✅شما میتونید فیلد جدید اضافه کنید، ولی اپلیکیشن با فایل پروتو قبلی اون فیلدهارو درنظر نمیگیره.
✅اگر اپلیکیشن شما بخواد فیلدی رو از ریکوئست دریافت کنه ولی نتونه پیداش کنه، مقدار پیشفرض درنظر میگیره. (به همین دلیله باید مقدار دیفالت رو بشناسید و مدیریتشون کنید)
✅همچنین فیلدها میتونند حذف بشن، ولی نباید دوباره تگ اون فیلد توی اون مسیج استفاده بشه. برای حذف میتونید به اول اسم فیلد OBSOLETE_ اضافه کنید یا تگ رو به reservet اضافه کنید.
✅تایپ های sint32 و sint64 با یکدیگر سازگار هستند اما با انواع دیگر عدد صحیح سازگار نیستند.
✅تایپ های string و byte ها تا زمانی که byte ها UTF-8 معتبر باشند سازگار هستند.
✅اگر byte ها دارای نسخه رمزگذاری شده پیام باشند ، پیام های با بایت سازگار هستند.
✅تایپ fixed32 با sfixed32 و fix64 با sfixed64 سازگار است.
✅تایپ های int32 ، uint32 ، int64 ، uint64 و bool همه با هم سازگار هستند - این بدان معناست که شما می توانید ، فیلدی را از یکی از این انواع به نوع دیگر تغییر دهید.
✅تایپ enum از نظر قالب با int32 ، uint32 ، int64 و uint64 سازگار است
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
✅هیچوقت نباید تگ فیلدهارو تغییر بدیم.
✅شما میتونید فیلد جدید اضافه کنید، ولی اپلیکیشن با فایل پروتو قبلی اون فیلدهارو درنظر نمیگیره.
✅اگر اپلیکیشن شما بخواد فیلدی رو از ریکوئست دریافت کنه ولی نتونه پیداش کنه، مقدار پیشفرض درنظر میگیره. (به همین دلیله باید مقدار دیفالت رو بشناسید و مدیریتشون کنید)
✅همچنین فیلدها میتونند حذف بشن، ولی نباید دوباره تگ اون فیلد توی اون مسیج استفاده بشه. برای حذف میتونید به اول اسم فیلد OBSOLETE_ اضافه کنید یا تگ رو به reservet اضافه کنید.
✅تایپ های sint32 و sint64 با یکدیگر سازگار هستند اما با انواع دیگر عدد صحیح سازگار نیستند.
✅تایپ های string و byte ها تا زمانی که byte ها UTF-8 معتبر باشند سازگار هستند.
✅اگر byte ها دارای نسخه رمزگذاری شده پیام باشند ، پیام های با بایت سازگار هستند.
✅تایپ fixed32 با sfixed32 و fix64 با sfixed64 سازگار است.
✅تایپ های int32 ، uint32 ، int64 ، uint64 و bool همه با هم سازگار هستند - این بدان معناست که شما می توانید ، فیلدی را از یکی از این انواع به نوع دیگر تغییر دهید.
✅تایپ enum از نظر قالب با int32 ، uint32 ، int64 و uint64 سازگار است
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 ✅proto? 🔴https://t.me/gopher_academy/627 ✅Defining A Message Type 🔴 https://t.me/gopher_academy/628 ✅Assigning Field Numbers 🔴https://t.me/gopher_academy/629 ✅Adding Comments 🔴 https://t.me/gopher_academy/630 ✅Reserved Fields…
🔴Any🔴
ت✅ایپ Any شامل یک پیام دلخواه سریال به صورت بایت ، همراه با URL است که به عنوان یک شناسه پیام عمل می کند.
✅نوع پیش فرض URL برای نوع پیام داده شده است به صورت زیر
type.googleapis.com/_packagename_._messagename_
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
ت✅ایپ Any شامل یک پیام دلخواه سریال به صورت بایت ، همراه با URL است که به عنوان یک شناسه پیام عمل می کند.
✅نوع پیش فرض URL برای نوع پیام داده شده است به صورت زیر
type.googleapis.com/_packagename_._messagename_
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 ✅proto? 🔴https://t.me/gopher_academy/627 ✅Defining A Message Type 🔴 https://t.me/gopher_academy/628 ✅Assigning Field Numbers 🔴https://t.me/gopher_academy/629 ✅Adding Comments 🔴 https://t.me/gopher_academy/630 ✅Reserved Fields…
🔴Oneof🔴
✅تایپ OneOf میگه فقط یکی از متغییرهایی که براش تعریف میکنیم میتونه مقدار داشته باشه.
✅در مسیج بالا داریم میگیم یه آیدی داریم و بعد از اون یکی از مقادیر my_string یا my_bool داریم
✅پس وقتی داریم این دو مقدار رو میخونیم فقط ممکنه یکی از اونها مقداری روش ست شده باشه. و اما چند نکته:
✅فیلدهای oneof نمیتونند repated باشن.
✅توسعه oneof میتونه خیلی پیچیده باشه.
✅در موقع خواندن مسیج oneof، همه فیلدها نال خواهد بود، بجز آخرین فیلدی که موقع ارسال درخواست ست کردید.
✅پس اگر my_string و my_bool ست کنید فقط my_bool داری مقدار خواهد بود و my_string نال خواهد بود.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
✅تایپ OneOf میگه فقط یکی از متغییرهایی که براش تعریف میکنیم میتونه مقدار داشته باشه.
✅در مسیج بالا داریم میگیم یه آیدی داریم و بعد از اون یکی از مقادیر my_string یا my_bool داریم
✅پس وقتی داریم این دو مقدار رو میخونیم فقط ممکنه یکی از اونها مقداری روش ست شده باشه. و اما چند نکته:
✅فیلدهای oneof نمیتونند repated باشن.
✅توسعه oneof میتونه خیلی پیچیده باشه.
✅در موقع خواندن مسیج oneof، همه فیلدها نال خواهد بود، بجز آخرین فیلدی که موقع ارسال درخواست ست کردید.
✅پس اگر my_string و my_bool ست کنید فقط my_bool داری مقدار خواهد بود و my_string نال خواهد بود.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🤔ایا تابحال میدونستید که👇🤔
😐حداکثر حجم اپلود در یوتوب چقدره 👇
🔺Maximum file size:
128GB
🔺Maximum video length:
12 hours
🔺Accepted YouTube video formats:
.mov, .mpeg, .mp4, .avi, .wmv, .mpegps, .flv, webM, and 3GPP
🎯 @gopher_academy
😐حداکثر حجم اپلود در یوتوب چقدره 👇
🔺Maximum file size:
128GB
🔺Maximum video length:
12 hours
🔺Accepted YouTube video formats:
.mov, .mpeg, .mp4, .avi, .wmv, .mpegps, .flv, webM, and 3GPP
🎯 @gopher_academy
🔴پذیرفته شد. جنریک به گولنگ اضافه میشه🔴
https://github.com/golang/go/issues/43651
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
https://github.com/golang/go/issues/43651
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
GitHub
spec: add generic programming using type parameters · Issue #43651 · golang/go
We propose adding support for type parameters to Go. This will change the Go language to support a form of generic programming. A detailed proposal document has been published, with input from many...
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 ✅proto? 🔴https://t.me/gopher_academy/627 ✅Defining A Message Type 🔴 https://t.me/gopher_academy/628 ✅Assigning Field Numbers 🔴https://t.me/gopher_academy/629 ✅Adding Comments 🔴 https://t.me/gopher_academy/630 ✅Reserved Fields…
🔴Maps🔴
✅در این تایپ میتونید اطلاعات رو به صورت key/value تعریف کنید (مشابه جیسون). از تمامی تایپها غیر از float/double پشتیابی میکنه، برای مثال:
✅در مثال بالا ما مجموعهای از یوزرها به همراه پروفایلشون داریم، که کلید هر پروفایل یوزرآیدی و مقدارش مسیج دیگهای به عنوان پروفایله. و اما چند نکته:
✅فیلدهای map نمیتونند repated باشن.
✅هیچگونه مرتب سازی روی مپ اتفاق نمیفته، چون مپ key/value هستش.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
✅در این تایپ میتونید اطلاعات رو به صورت key/value تعریف کنید (مشابه جیسون). از تمامی تایپها غیر از float/double پشتیابی میکنه، برای مثال:
✅در مثال بالا ما مجموعهای از یوزرها به همراه پروفایلشون داریم، که کلید هر پروفایل یوزرآیدی و مقدارش مسیج دیگهای به عنوان پروفایله. و اما چند نکته:
✅فیلدهای map نمیتونند repated باشن.
✅هیچگونه مرتب سازی روی مپ اتفاق نمیفته، چون مپ key/value هستش.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 ✅proto? 🔴https://t.me/gopher_academy/627 ✅Defining A Message Type 🔴 https://t.me/gopher_academy/628 ✅Assigning Field Numbers 🔴https://t.me/gopher_academy/629 ✅Adding Comments 🔴 https://t.me/gopher_academy/630 ✅Reserved Fields…
🔴Packages🔴
✅خیلی مهمه برای فایلهای پروتو پیکج تعریف کنید، وقتی کد برای زبان خودتون جنریت کنید این پکیجها کاربرد دارن، همچنین از کانفلیکت بین اسم مسیجها جلوگیری میکنه، پیکجها تو تمام زبانهای پشتیبانی میشن.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
✅خیلی مهمه برای فایلهای پروتو پیکج تعریف کنید، وقتی کد برای زبان خودتون جنریت کنید این پکیجها کاربرد دارن، همچنین از کانفلیکت بین اسم مسیجها جلوگیری میکنه، پیکجها تو تمام زبانهای پشتیبانی میشن.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 ✅proto? 🔴https://t.me/gopher_academy/627 ✅Defining A Message Type 🔴 https://t.me/gopher_academy/628 ✅Assigning Field Numbers 🔴https://t.me/gopher_academy/629 ✅Adding Comments 🔴 https://t.me/gopher_academy/630 ✅Reserved Fields…
🔴Defining Services🔴
✅ خب میخوایم درمورد ویژگی اصلی پروتوبافر حرف بزنیم، در فایل پروتو بجز مسیجها میتونید سرویسها روهم تعریف کنید، سرویس، اندپوینتی هست که کاربر (یا بقیه سرویسها) میتونه بهش دسترسی داشته باشه، برای مثال:
✅در این فایل یک سرویس سرچ تعریف کردیم و گفتیم انتظار داریم یک مسیج سرویس ریکوئست دریافت کنیم و در جواب یک مسیج سرچ ریسپانس برمیگردونیم، سادس درسته؟ در اصل این شیوه ساخت یک API در فایل پروتو هست، در اینجا به یک فریمورک نیاز داریم تا این سرویس رو هندل کنه و کدهاشو جنریت کنه، در پروتو ورژن ۳ از فریمورک gRPC گوگل کمک میگیره، ولی شما میتونید روی اینترنت فریمورکهای دیگم پیدا کنید.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
✅ خب میخوایم درمورد ویژگی اصلی پروتوبافر حرف بزنیم، در فایل پروتو بجز مسیجها میتونید سرویسها روهم تعریف کنید، سرویس، اندپوینتی هست که کاربر (یا بقیه سرویسها) میتونه بهش دسترسی داشته باشه، برای مثال:
✅در این فایل یک سرویس سرچ تعریف کردیم و گفتیم انتظار داریم یک مسیج سرویس ریکوئست دریافت کنیم و در جواب یک مسیج سرچ ریسپانس برمیگردونیم، سادس درسته؟ در اصل این شیوه ساخت یک API در فایل پروتو هست، در اینجا به یک فریمورک نیاز داریم تا این سرویس رو هندل کنه و کدهاشو جنریت کنه، در پروتو ورژن ۳ از فریمورک gRPC گوگل کمک میگیره، ولی شما میتونید روی اینترنت فریمورکهای دیگم پیدا کنید.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
Gopher Academy
🔴Defining Services🔴 ✅ خب میخوایم درمورد ویژگی اصلی پروتوبافر حرف بزنیم، در فایل پروتو بجز مسیجها میتونید سرویسها روهم تعریف کنید، سرویس، اندپوینتی هست که کاربر (یا بقیه سرویسها) میتونه بهش دسترسی داشته باشه، برای مثال: ✅در این فایل یک سرویس سرچ تعریف کردیم…
فرض کنید شما یک سرور جاوا دارید که یک سرویسی رو ارائه میده، حالا هر کلاینتی با هر زبانی، برای مثال گولنگ، پایتون، جاوا و... میتونه با کمک فایلهای پروتو کدهای کلاینت gRPC جنریت کنه، و کلاینت یک ریکوئست پروتوبافر تولید میکنه برای سرور میفرسته، و سرور در پاسخ یک ریسپانس پروتوبافر ارسال میکنه. پس پروتوبافر اینجا یک شیوه انتقال دیتا توی شبکهاس که تمام زبانهارو ساپورت میکنه که همین نقطه قوتش شده.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🎯 آموزش کار با Gin Web Framework 🎯
🔸 part 1
🔴 https://vrgl.ir/iPhoQ
🔸 part 2
🔴 https://vrgl.ir/eZW4m
🔸 part 3
🔴 https://vrgl.ir/wXpwI
🔸part 4
🔴 https://vrgl.ir/rcsZs
🔸part 5
🔴 https://vrgl.ir/H72zq
🔸 part 6
🔴 https://vrgl.ir/RWMSW
🔸part 7
🔴 https://vrgl.ir/x0UTP
🔸 part 8
🔴 https://vrgl.ir/pTeDF
🔸part 9
🔴 https://t.me/gopher_academy/430
.
#gin
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🔸 part 1
🔴 https://vrgl.ir/iPhoQ
🔸 part 2
🔴 https://vrgl.ir/eZW4m
🔸 part 3
🔴 https://vrgl.ir/wXpwI
🔸part 4
🔴 https://vrgl.ir/rcsZs
🔸part 5
🔴 https://vrgl.ir/H72zq
🔸 part 6
🔴 https://vrgl.ir/RWMSW
🔸part 7
🔴 https://vrgl.ir/x0UTP
🔸 part 8
🔴 https://vrgl.ir/pTeDF
🔸part 9
🔴 https://t.me/gopher_academy/430
.
#gin
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy