برنامه های کاربردی خط فرمان به ندرت بدون پیکربندی اضافی از کادر استفاده می شوند. پیش فرض های خوب مهم هستند ، اما برنامه های مفید باید پیکربندی کاربران را بپذیرند. در اکثر سیستم عامل ها ، برنامه های خط فرمان پرچم ها را برای سفارشی کردن اجرای فرمان می پذیرند. پرچم ها رشته های مشخص شده با ارزش کلیدی هستند که پس از نام دستور اضافه می شوند. به شما اجازه می دهد تا با استفاده از بسته پرچم از کتابخانه استاندارد ، آب و برق را که پرچم ها را می پذیرند ، صنایع دستی کنید.
در این آموزش روشهای مختلفی برای استفاده از بسته پرچم برای ساخت انواع مختلف برنامه های خط فرمان کشف خواهید کرد. برای کنترل خروجی برنامه ، از پرچم استفاده خواهید کرد ، آرگومان های موقعیتی را که در آن پرچم ها و داده های دیگر را مخلوط می کنید ، معرفی می کنید و سپس زیر مجموعه های فرعی را پیاده سازی می کنید.
استفاده از پرچم برای تغییر رفتار برنامه
استفاده از بسته پرچم شامل سه مرحله است: ابتدا متغیرهایی را برای گرفتن مقادیر پرچم تعریف کنید ، سپس پرچم هایی را که برنامه GO شما استفاده می کند تعریف کنید و در آخر ، پرچم های ارائه شده به برنامه را پس از اجرای آن تجزیه کنید. بیشتر کارکردهای موجود در بسته پرچم مربوط به تعیین پرچم ها و اتصال آنها به متغیرهایی است که شما تعریف کرده اید. مرحله تجزیه توسط عملکرد تجزیه () انجام می شود.
برای نشان دادن ، برنامه ای را ایجاد می کنید که پرچم بولی را تعریف می کند که پیام را تغییر می دهد که برای خروجی استاندارد چاپ می شود. اگر یک پرچم کولور ارائه شود ، این برنامه پیام را به رنگ آبی چاپ می کند. در صورت عدم ارائه پرچم ، پیام بدون هیچ رنگی چاپ می شود.
یک فایل جدید به نام boolean. go ایجاد کنید:
برای ایجاد برنامه ، کد زیر را به پرونده اضافه کنید:
این مثال از توالی های فرار ANSI برای آموزش ترمینال برای نمایش خروجی رنگی استفاده می کند. اینها سکانس های تخصصی شخصیت ها هستند ، بنابراین معقول است که نوع جدیدی را برای آنها تعریف کنید. در این مثال ، ما آن نوع رنگ را نامیده ایم و نوع را به عنوان یک رشته تعریف کرده ایم. سپس ما یک پالت رنگ را برای استفاده در بلوک const که در زیر آمده است تعریف می کنیم. تابع Colorize تعریف شده پس از بلوک Const یکی از این ثابت های رنگی و یک متغیر رشته را برای رنگ آمیزی می پذیرد. سپس به ترمینال دستور می دهد تا ابتدا با چاپ دنباله فرار برای رنگ درخواست شده ، رنگ را تغییر دهد ، سپس پیام را چاپ می کند و در نهایت درخواست می کند که ترمینال با چاپ توالی تنظیم مجدد رنگ ، رنگ خود را تنظیم مجدد کند.
در Main ، ما از عملکرد Flag. bool برای تعریف پرچم بولی به نام رنگ استفاده می کنیم. پارامتر دوم این عملکرد ، FALSE ، مقدار پیش فرض این پرچم را در صورت عدم ارائه تنظیم می کند. برخلاف انتظاراتی که ممکن است داشته باشید ، این که این امر به درستی رفتار را معکوس نمی کند به گونه ای که ایجاد پرچم باعث کاذب آن می شود. در نتیجه ، مقدار این پارامتر تقریباً همیشه با پرچم های بولی نادرست است.
پارامتر نهایی رشته ای از مستندات است که می تواند به عنوان یک پیام استفاده چاپ شود. مقدار برگشتی از این عملکرد یک اشاره گر به یک بول است. تابع Flag. Parse در خط بعدی از این نشانگر استفاده می کند تا متغیر BOOL را بر اساس پرچم های منتقل شده توسط کاربر تنظیم کند. سپس ما می توانیم با استفاده از اشاره گر ، مقدار این نشانگر بول را بررسی کنیم. اطلاعات بیشتر در مورد متغیرهای اشاره گر را می توان در آموزش نشانگرها یافت. با استفاده از این مقدار بولی ، می توانیم هنگام تنظیم پرچ م-color با رنگ آمیزی تماس بگیریم و در صورت وجود پرچم ، متغیر fmt. println را فراخوانی کنیم.
فایل را ذخیره کرده و برنامه را بدون هیچ پرچمی اجرا کنید:
خروجی زیر را مشاهده خواهید کرد:
اکنون این برنامه را دوباره با پرچ م-color اجرا کنید:
خروجی همان متن خواهد بود ، اما این بار در رنگ آبی.
پرچم ها تنها مقادیر منتقل شده به دستورات نیستند. همچنین ممکن است نام پرونده یا داده های دیگر را ارسال کنید.
کار با استدلال های موقعیتی
به طور معمول دستورات تعدادی از استدلالها را که به عنوان موضوع تمرکز فرمان عمل می کنند ، می گیرند. به عنوان مثال ، فرمان سر ، که خطوط اول یک پرونده را چاپ می کند ، اغلب به عنوان مثال به عنوان مثال استفاده می شود. مثال پرونده. txt یک آرگومان موقعیتی در دعوت از دستور سر است.
تابع تجزیه () تا زمانی که یک استدلال غیر پرچم را تشخیص دهد ، به پرچم هایی که با آن روبرو می شوند ، ادامه خواهد داد. بسته پرچم این موارد را از طریق توابع ARGS () و ARG () در دسترس قرار می دهد.
برای نشان دادن این موضوع ، شما یک اجرای مجدد ساده از دستور سر ایجاد خواهید کرد ، که چند خط اول یک پرونده معین را نشان می دهد:
یک فایل جدید به نام head. go ایجاد کنید و کد زیر را اضافه کنید:
ابتدا یک متغیر شمارش را برای نگه داشتن تعداد خطوطی که برنامه باید از پرونده خوانده شود تعریف می کنیم. سپس پرچ م-n را با استفاده از flag. intvar تعریف می کنیم ، و رفتار برنامه اصلی سر را آینه می کنیم. این عملکرد به ما امکان می دهد تا بر خلاف توابع پرچم که پسوند VAR ندارند ، نشانگر خود را به یک متغیر منتقل کنیم. جدا از این تفاوت ، بقیه پارامترها به Flag. Intvar Flag. int Commentpart خود را دنبال کنید: نام پرچم ، یک مقدار پیش فرض و توضیحات. مانند مثال قبلی ، ما برای پردازش ورودی کاربر با flag. parse () تماس می گیریم.
بخش بعدی پرونده را می خواند. ما ابتدا یک متغیر io. reader را تعریف می کنیم که یا روی پرونده درخواست شده توسط کاربر تنظیم می شود ، یا ورودی استاندارد به برنامه منتقل می شود. در بیانیه IF ، ما از عملکرد Flag. arg برای دسترسی به اولین آرگومان موقعیتی بعد از همه پرچم ها استفاده می کنیم. اگر کاربر نام پرونده را تهیه کند ، این تنظیم می شود. در غیر این صورت ، این رشته خالی خواهد بود (""). هنگامی که یک نام پرونده وجود دارد ، ما از تابع OS. open برای باز کردن آن پرونده استفاده می کنیم و io. reader را که قبلاً تعریف کرده ایم در آن پرونده تنظیم می کنیم. در غیر این صورت ، ما از os. stdin برای خواندن از ورودی استاندارد استفاده می کنیم.
در بخش آخر از a *bufio. scanner ایجاد شده با bufio. newscanner برای خواندن خطوط از متغیر io. reader در. ما با استفاده از یک حلقه برای مقدار شمارش تکرار می کنیم ، اگر اسکن خط با buf. scan یک مقدار کاذب ایجاد می کند ، با استراحت فراخوانی می کنیم ، نشان می دهد که تعداد خطوط کمتر از شماره درخواست شده توسط کاربر است.
این برنامه را اجرا کنید و محتوای پرونده ای را که اخیراً نوشتید با استفاده از head. go به عنوان آرگومان پرونده نمایش دهید:
جداکننده - یک پرچم ویژه است که توسط بسته پرچم شناخته شده است که نشان می دهد هیچ آرگومان پرچم دیگری دنبال نمی شود. هنگام اجرای این دستور ، خروجی زیر را دریافت می کنید:
برای تنظیم میزان خروجی از پرچ م-n تعریف شده استفاده کنید:
این فقط بیانیه بسته را خروجی می کند:
سرانجام ، هنگامی که این برنامه تشخیص داد که هیچ استدلال موقعیتی ارائه نشده است ، دقیقاً مانند سر ، ورودی از ورودی استاندارد را می خواند. سعی کنید این دستور را اجرا کنید:
خروجی را مشاهده خواهید کرد:
رفتار توابع پرچم که تاکنون دیده اید ، محدود به بررسی کل دعوت نامه است. شما همیشه این رفتار را نمی خواهید ، به خصوص اگر در حال نوشتن یک ابزار خط فرمان هستید که از زیر مجموعه ها پشتیبانی می کند.
با استفاده از Flagset برای اجرای زیر فرماندها
برنامه های خط فرمان مدرن اغلب "زیر مجموعه های فرعی" را برای جمع کردن مجموعه ای از ابزارها تحت یک دستور واحد اجرا می کنند. مشهورترین ابزاری که از این الگوی استفاده می کند ، git است. هنگام بررسی یک فرمان مانند Git init ، GIT فرمان است و شروع زیر فرماندهی GIT است. یکی از ویژگی های قابل توجه زیر فرماندهان این است که هر یک از زیر مجموعه ها می توانند مجموعه پرچم های خاص خود را داشته باشند.
برنامه های GO می توانند با استفاده از پرچم (*Flagset) از زیر مجموعه های فرعی خود پشتیبانی کنند. برای نشان دادن این موضوع ، برنامه ای را ایجاد کنید که با استفاده از دو زیرزمین با پرچم های مختلف ، یک دستور را پیاده سازی کند.
یک فایل جدید به نام SubCommand. go ایجاد کرده و محتوای زیر را به پرونده اضافه کنید:
این برنامه به چند بخش تقسیم می شود: عملکرد اصلی ، عملکرد ریشه و عملکردهای فردی برای اجرای زیر فرماندهی. عملکرد اصلی خطاهای برگشتی از دستورات را انجام می دهد. اگر هر عملکرد خطایی را برگرداند ، اگر عبارت آن را بدست آورد ، خطا را چاپ می کند و برنامه با کد وضعیت 1 از آن خارج می شود و این نشان می دهد که خطایی برای بقیه سیستم عامل رخ داده است. در داخل اصلی ، ما تمام استدلالهایی را که برنامه با استفاده از Root استفاده می شد ، تصویب می کنیم. ما اولین آرگومان را حذف می کنیم ، که نام برنامه (در مثالهای قبلی است ./subcommand) با برش OS. args ابتدا.
تابع ریشه [] دونده را تعریف می کند ، جایی که همه لباس های فرعی تعریف می شوند. Runner یک رابط برای زیر مجموعه های فرعی است که به Root اجازه می دهد تا با استفاده از نام () نام فرعی را بازیابی کند و آن را در برابر متغیر فرعی محتویات مقایسه کند. هنگامی که فرعی صحیح پس از تکرار از طریق متغیر CMDS قرار گرفت ، ما فرعی را با بقیه آرگومان ها اولیه می کنیم و از روش اجرا () آن فرمان استفاده می کنیم.
ما فقط یک فرماندهی فرعی را تعریف می کنیم ، اگرچه این چارچوب به راحتی به ما امکان می دهد دیگران را بسازیم. WheetCommand با استفاده از NewGreetCommand فوری می شود که در آن ما یک Flag. flagset جدید را با استفاده از flag. newflagset ایجاد می کنیم. flag. newflagset دو استدلال می گیرد: یک نام برای مجموعه پرچم و یک استراتژی برای گزارش خطاهای تجزیه. نام *flag. flagset با استفاده از پرچم قابل دسترسی است. ( *Flagset). ما از این روش در روش ( *سلام command) . name () استفاده می کنیم تا نام فرعی با نامی که به *flag. flagset داده ایم مطابقت داشته باشد. NewGreetCommand همچنین یک پرچم نام را به روشی مشابه با مثالهای قبلی تعریف می کند ، اما در عوض آن را به عنوان روشی از قسمت *flag. flagset از *سلام و احوالپرسی ، gc. fs می نامد. هنگامی که root روش اولیه () *heetCommand را فراخوانی می کند ، ما آرگومان های ارائه شده را به روش پارس قسمت *flag. flagset منتقل می کنیم.
اگر این برنامه را بسازید و سپس آن را اجرا کنید ، دیدن زیر مجموعه های فرعی آسان تر خواهد بود. ساخت برنامه:
اکنون برنامه را بدون استدلال اجرا کنید:
این خروجی را مشاهده خواهید کرد:
اکنون برنامه را با زیر مجموعه تبریک اجرا کنید:
این خروجی زیر را تولید می کند:
اکنون برای مشخص کردن یک نام از پرچ م-name با سلام استفاده کنید:
این خروجی را از برنامه مشاهده خواهید کرد:
این مثال برخی از اصول را نشان می دهد که چگونه برنامه های بزرگتر خط فرمان می توانند در GO ساختار یافته باشند. Flagset S به گونه ای طراحی شده است که به توسعه دهندگان کنترل بیشتری بر روی کجا و چگونه پرچم ها توسط منطق تجزیه پرچم پردازش می شوند.
نتیجه
پرچم ها برنامه های شما را در زمینه های بیشتر مفیدتر می کند زیرا به کاربران شما امکان کنترل نحوه اجرای برنامه ها را می دهد. مهم است که به کاربران پیش فرض مفیدی ارائه دهید ، اما باید به آنها این فرصت را بدهید که تنظیماتی را که برای وضعیت آنها کار نمی کنند ، نادیده بگیرند. شما دیده اید که بسته پرچم گزینه های انعطاف پذیر را برای ارائه گزینه های پیکربندی به کاربران خود ارائه می دهد. شما می توانید چند پرچم ساده را انتخاب کنید ، یا یک مجموعه گسترده از زیر مجموعه ها بسازید. در هر صورت ، استفاده از بسته پرچم به شما کمک می کند تا به سبک تاریخ طولانی ابزارهای خط فرمان انعطاف پذیر و قابل اسکریپت ، آب و برق بسازید.
برای کسب اطلاعات بیشتر در مورد زبان برنامه نویسی GO ، Full How To Code in GO را بررسی کنید.
اگر از این آموزش و جامعه وسیع ما لذت بردید ، در نظر بگیرید که محصولات دیجیتالی ما را بررسی کنید که می تواند به شما در دستیابی به اهداف توسعه نیز کمک کند.
سری آموزش: نحوه کدگذاری در GO
Go (یا Golang) یک زبان برنامه نویسی مدرن است که در ابتدا توسط Google ساخته شده است که از نحو سطح بالا شبیه به زبانهای اسکریپت استفاده می کند. این امر به دلیل حداقل نحو و رسیدگی نوآورانه همزمان و همچنین ابزاری که برای ساختن باینری های بومی در سیستم عامل های خارجی فراهم می کند ، محبوب است.
تجارت با گزینههای باینری...
ما را در سایت تجارت با گزینههای باینری دنبال می کنید
برچسب :
نویسنده : حمیدرضا پگاه
بازدید : 35
تاريخ : پنجشنبه
21 ارديبهشت
1402 ساعت: 23:23