شما در حال مطالعه نسخه آفلاین یکی از مطالب «مجله فرادرس» هستید. لطفاً توجه داشته باشید، ممکن است برخی از قابلیتهای تعاملی مطالب، مانند امکان پاسخ به پرسشهای چهار گزینهای و مشاهده جواب صحیح آنها، نمایش نتیجه آزمونها، پاسخ تشریحی سوالات، پخش فایلهای صوتی و تصویری و غیره، در این نسخه در دسترس نباشند. برای دسترسی به نسخه آنلاین مطلب، استفاده از کلیه امکانات آن و داشتن تجربه کاربری بهتر اینجا کلیک کنید.
برخی اپلیکیشنهای Go در سمت فرانتاند نیازمند اجرای اپلیکیشنهای با امکانات کامل نیستند. اغلب این اپلیکیشنها محتوای استاتیک عرضه میکنند و به ندرت با مقادیر دینامیک سر و کار دارند. برای نمونه فید رسانه اجتماعی خود را در نظر بگیرید. هر پست از نوع خاص شبیه هم به نظر میرسد، اما با دادههای خاصی برای هر کاربر مقداردهی میشود. در واقع در اینجا از نوعی قالببندی استفاده شده است. در این مقاله به بررسی قالب های Go می پردازیم.
قالبها اساساً فایلهای متنی هستند که برای ایجاد محتوای دینامیک مورد استفاده قرار میگیرند. برای نمونه تابع جاوا اسکریپت زیر name را به عنوان یک آرگومان میگیرد و رشتههای مختلفی تولید میکند.
از همین مفهوم میتوان برای تولید صفحههای وب در Go نیز استفاده کرد. قالبهای وب به ما امکان میدهند که نتایج شخصیسازیشده در اختیار کاربران خود قرار دهیم. تولید قالبهای وب با استفاده از الحاق رشته یک وظیفه دشوار است و ممکن است منجر به حملات تزریق نیز بشود.
قالبها در Go
دو پکیج در Go جهت کار با قالبها به شرح زیر وجود دارند:
text/templates: برای تولید خروجی متنی استفاده میشود.
html/templates: برای تولید خروجی HTML امن در برابر تزریق کد مورد استفاده قرار میگیرد.
هر دو پکیج فوق اینترفیس واحدی دارند که تفاوتهای مختص وب ظریفی در زمینه تگهای اسکریپت انکودینگ برای جلوگیری از اجرا شدن، تحلیل نقشهها به صورت JSON در View و موارد دیگر دارند.
نخستین قالب
بسط یک فایل قالب میتواند هر چیزی باشد. ما از gohtml. استفاده میکنیم چون شامل ابزارهای توسعه پشتیبانی شده روی IDE-های مختلف است.
اکشن ها یعنی ارزیابیهای داده یا ساختارهای کنترل درون {{ و }} قرار دارند. ارزیابی دادهها درون آن به نام pipeline نامیده میشود. هر چیزی خارج از آنها به صورت بدون تغییر به خروجی ارسال میشود.
شما میتواند چندین فایل را در خط 10 به صورت رشتههای جدا شده با کاما (مسیر فایلها) تحلیل کنید یا این که میتوانید همه فایلهای درون یک دایرکتوری را تحلیل کنید. به مثال زیر توجه کنید:
این کد یک کانتینر قالب (که در اینجا tpl نامیده شده است) و یک خطا بازگشت میدهد. ما میتوانیم از دادههای خود برای اجرای tpl به وسیله اجرای متد استفاده کنیم. در حالت وجود چند قالب، نام قالب به عنوان دومین آرگومان و دادهها به عنوان آرگومان سوم ارسال میشوند.
ما ساختمان داده خود را (در اینجا struct است) تعریف میکنیم. این ساختمان داده میتواند هر چیزی در GO مانند slice، map، struct، slice-of-structs، و structs-of-slice of structs باشد. همه این موارد را در ادامه بررسی میکنیم.
دادهها با استفاده از نقطه واکشی میشوند. از آن برای دسترسی به متغیرهای داده درون قالبها استفاده میکنیم. به خاطر داشته باشید که شناساگرهای درون دادههای ارسالی باید با حرف بزرگ آغاز شوند. ما میتوانیم از آنها برای مقداردهی یک متغیر درون اکشنهایی مانند myCoupon:=.Coupon$ استفاده کنیم.
میتوانیم نتیجه اجرای صفحه وب یا خروجی استاندارد را در خروجی ارائه کنیم، زیرا قالب، متدهایی اجرا میکند که هر مقداری که اینترفیس با نوع Writer را پیادهسازی کند، میپذیرد.
این قالب به صورت متنی ساده در خروجی کنسول رندر میشود؛ اما اگر از آن برای ارسال دادهها به صورت پاسخی به یک درخواست وب استفاده کنیم، به صورت یک صفحه وب رندر میشود و بدین ترتیب میتوانیم در آن از تگهای HTML استفاده کنیم.
ترجیح بر این است که کار تحلیلی درون تابع init انجام یابد و اجرا در مکانهای لازم صورت گیرد.
استفاده از ساختمانهای داده مختلف در قالبهای وب
در این بخش به توضیح روش استفاده از ساختمانهای داده مختلف زبان برنامهنویسی Go در قالبهای وب میپردازیم.
Slice یا آرایه
یک Slice از رشتهها را در نظر بگیرید:
این کد میتواند در قالب با تعریف بازهای روی اسلایس (و همچنین آرایه) درون اکشنها استفاده شود. اگر مقدار pipeline دارای طول صفر باشد، چیزی اجرا نخواهد شد، در غیر این صورت از نقطه روی عناصر متوالی اسلایس (و همچنین آرایه) استفاده میشود و قالب اجرا خواهد شد.
Map
به مثالی از ساختمان داده Map توجه کنید.
مقدار pipeline درون Actions یک Map است. اگر هیچ جفت کلید/مقدار در map وجود نداشته باشد، هیچ چیز در خروجی ارائه نمیشود، در غیر این صورت از نقطه برای عناصر متوالی map استفاده میشود و قالب بدینصورت اجرا میشود که همه کلیدها به صورت $key و همه مقادیر متناظر به صورت $val در نظر گرفته میشوند. اگر کلیدها از نوع ابتدایی با ترتیب تعریف شده (comparable) باشند، عناصر در ترتیب کلید مرتبشده بازدید میشوند.
Struct
در این بخش مثالی از یک Struct با مجموعهای از فیلدها که به صورت inline اعلان شدهاند را بررسی میکنیم:
ابتدا یک نقطه و سپس نام فیلد struct داده به صورت Name. به عنوان آرگومان قالب استفاده میشود. نتیجه مقدار فیلد است. فراخوانی فیلدها را میتوان به صورت Field1.Field2. به هم زنجیر کرد. فیلدها میتوانند روی متغیرها ارزیابی شوند که شامل زنجیرههای $x.Field1.Field2 است. قالب زیر فیلدهای ذخیره شده در متغیرها را نشان میدهد و سپس در Actions ارزیابی میشود:
Slice of Structs
در این بخش به بررسی مثالی از قالب با استفاده از ساختمان داده اسلایس struct میپردازیم:
ما از یک بازه استفاده کردهایم تا روی یک اسلایس حلقهای تعریف کنیم. مقدار pipeline در Action باید یک آرایه (یا اسلایس) باشد. اگر مقدار اسلایس صفر باشد، هیچ خروجی ارائه نمیشود، اما در غیر این صورت از نقطه برای عناصر متوالی آرایه یا اسلایس استفاده میشود و قالب اجرا خواهد شد.
ساختمانهای داده مختلف در Go میتوانند با هم ترکیب نیز بشوند تا قالبهای مفیدی ایجاد کنند.
نکتهای در مورد استفاده از گزارههای شرطی روی قالبها
امکان نوشتن قالبهای شرطی مانند زیر نیز وجود دارد:
{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}
بدین ترتیب تواناهایی شگفتانگیزی برای تولید محتوای دینامیک پیدا میکنیم. اگر مقدار pipeline خالی (یعنی flase، 0 یا هر اشارهگر تهی یا مقدار اینترفیس و همچنین هر آرایه، اسلایس، نقشه یا رشته با طول صفر) باشد، T0 اجرا میشود و در غیر این صورت T1 اجرا خواهد شد.
تابع در قالبها
میتوان از هر تابعی در یک قالب Go استفاده کرد؛ به شرط این که تعریف شده باشد. به صورت پیشفرض هیچ تابعی در قالب تعریف نشده است، اما متد Funcs روی یک قالب میتواند برای اضافه کردن تابع از طریق ایجاد نگاشتهایی مانند زیر استفاده شود:
برای ایجاد یک نگاشت از نامها به تابعها باید از نوع FuncMap استفاده کنیم. هر تابع یا باید یک مقدار بازگشتی منفرد داشته باشد و یا دو مقدار بازگشتی داشته باشد که دونی خطای نوع داشته باشد.
در خط 7 کد فوق ما یک نگاشت از تابع monthDayYear به یک نام fdateMDY تعریف کردهایم. اینک این تابع میتواند درون قالب استفاده شود. به خاطر داشته باشید که نقطه (.) دادههای ارائه شده به قالب را نگهداری میکند.
روش های مختلفی برای استفاده از قالبها در Go وجود دارند. در این نوشته با برخی از این روشها آشنا شدیم.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
«میثم لطفی» در رشتههای ریاضیات کاربردی و مهندسی کامپیوتر به تحصیل پرداخته و شیفته فناوری است. وی در حال حاضر علاوه بر پیگیری علاقهمندیهایش در رشتههای برنامهنویسی، کپیرایتینگ و محتوای چندرسانهای، در زمینه نگارش مقالاتی با محوریت نرمافزار با مجله فرادرس همکاری دارد.
شما در حال مطالعه نسخه آفلاین یکی از مطالب «مجله فرادرس» هستید. لطفاً توجه داشته باشید، ممکن است برخی از قابلیتهای تعاملی مطالب، مانند امکان پاسخ به پرسشهای چهار گزینهای و مشاهده جواب صحیح آنها، نمایش نتیجه آزمونها، پاسخ تشریحی سوالات، پخش فایلهای صوتی و تصویری و غیره، در این نسخه در دسترس نباشند. برای دسترسی به نسخه آنلاین مطلب، استفاده از کلیه امکانات آن و داشتن تجربه کاربری بهتر اینجا کلیک کنید.