نحوه کارکرد سیستم بسته بندی و اصطلاح Comma Ok در Go
اصطلاح "کاما ok" و سیستم بسته دو مفهوم اساسی در Go هستند. آنها به افزایش خوانایی کد شما کمک می کنند و فلسفه سادگی و صراحت Go را منعکس می کنند.
در این مقاله، هم با اصطلاحات ok کاما و هم سیستم بسته آشنا خواهید شد. ما در مورد اینکه آنها چه هستند و چگونه کار می کنند صحبت خواهیم کرد و من چند نمونه را در طول مسیر نشان خواهم داد.
کاما OK اصطلاح چیست؟
اصطلاح OK کاما که به عنوان الگوی کاما ok نیز شناخته می شود، ساختاری است که در موقعیت های خاص در Go استفاده می شود. در این شرایط، یک عملیات ممکن است یک مقدار اختیاری را برگرداند و دومین مقدار بازگشتی یک بولی (ok) خواهد بود که نشان میدهد آیا عملیات موفق بوده است یا خیر.
اصطلاح کاما Ok از یک نحو خاص پیروی می کند:
value, ok := expression
value
نشان دهنده نتیجه عملیات در صورت موفقیت آمیز بودن آن است. دومین مقدار بازگشتی، ok
، نشان می دهد که آیا عمل موفق بوده است، درست یا نادرست است. در نهایت، «expression» عملیاتی است که انجام میشود، که معمولاً شامل جستجو، تأیید نوع، دریافت کانال یا هر عملکردی است که ممکن است با شکست مواجه شود.
هنگام برخورد با مدیریت خطا، از الگوی مشابهی استفاده می شود:
value, err := expression
اگر خطا رخ دهد، err
نشان دهنده یک خطا است. در غیر این صورت، صفر است. این الگو معمولاً برای توابعی استفاده می شود که ممکن است از کار بیفتند و خطا را برگردانند.
بیایید نگاهی به مثالی با استفاده از اصطلاح ok کاما بیندازیم:
package main import ( "fmt" ) func main () { myMap := map [ string ] int { "apple" : 5 , "banana" : 10 } value, ok := myMap[ "apple" ] if ok { fmt.Println( "Value found:" , value) // Output: Value found: 5 } else { fmt.Println( "Key not found" ) } value, ok = myMap[ "cherry" ] if ok { fmt.Println( "Value found:" , value) } else { fmt.Println( "Key not found" ) // Output: Key not found } }
در اینجا، با استفاده از یک کلید مقداری را از نقشه بازیابی می کنیم و با استفاده از اصطلاح OK کاما تعیین می کنیم که آیا کلید در نقشه وجود دارد یا خیر.
اگر کلید وجود داشته باشد، ok
true را برمی گرداند و مقدار چاپ می شود. اگر کلید وجود نداشته باشد، ok
false را برمیگرداند و پیام «Key not found» چاپ میشود.
import ( "fmt" "strconv" ) func main () { if num, err := strconv.Atoi( "123" ); err == nil { fmt.Printf( "Successfully converted to number: %d\n" , num) } else { fmt.Printf( "Conversion failed: %s\n" , err) } if num, err := strconv.Atoi( "abc" ); err == nil { fmt.Printf( "Successfully converted to number: %d\n" , num) } else { fmt.Printf( "Conversion failed: %s\n" , err) } }
در اینجا، الگوی خطای ok برای رسیدگی به خطاهای احتمالی که ممکن است در طول اجرای تابع strconv.Atoi
رخ دهد، استفاده می شود.
num, err := strconv.Atoi("123")
تلاش می کند یک رشته را به یک عدد صحیح تبدیل کند. اگر تبدیل با موفقیت انجام شود، err
صفر است و num شامل عدد تبدیل شده است. اگر تبدیل ناموفق باشد، 'err' حاوی یک پیام خطایی است که نشان می دهد چه چیزی اشتباه رخ داده است، و num 0 است.
از حالت کاما OK استفاده کنید
در زیر چند مورد استفاده از نحو OK آورده شده است:
جستجوی کلید نقشه
هنگام بازیابی یک مقدار از نقشه، اصطلاح OK به شما اجازه می دهد تا تحلیل کنید که آیا کلید در نقشه وجود دارد یا خیر.
value, ok := myMap[key] if ok { fmt.Printf( "Value found: %v\n" , value) } else { fmt.Println( "Key not found in map" ) }
این به شما امکان می دهد بین کلیدی که وجود ندارد و کلیدی که با مقدار صفر وجود دارد تفاوت قائل شوید و در نتیجه از فرضیات نادرست در کد خود جلوگیری کنید.
اظهارات را تایپ کنید
هنگام کار با رابطها، میتوانید از اصطلاح OK کاما استفاده کنید تا با خیال راحت ادعاهای نوع را امتحان کنید. به عنوان مثال:
var i interface {} = "hello" s, ok := i.( string ) if ok { fmt.Printf( "'i' is a string: %s\n" , s) } else { fmt.Println( "'i' is not a string" ) }
این به شما این امکان را میدهد تا تحلیل کنید که آیا یک مقدار واسط دارای یک نوع خاص است، بدون ایجاد وحشت در صورت شکست ادعا.
خواندن از کانال ها
هنگام خواندن از یک کانال، می توانید از اصطلاح OK برای تحلیل اینکه آیا کانال بسته شده است استفاده کنید.
value, ok := <-ch if !ok { fmt.Println( "Channel is closed" ) } else { fmt.Printf( "Received value: %v\n" , value) }
این به تمایز بین مقدار صفر دریافتی از یک کانال باز و مقدار صفر دریافتی به دلیل بسته بودن کانال کمک می کند.
کاما OK با Blank Identifier
زمانی میتوانید از شناسه خالی ( _
) استفاده کنید که فقط به نتیجه بولی اصطلاح OK کاما اهمیت میدهید و نیازی به استفاده از خود مقدار ندارید.
if _, ok := myMap[key]; ok { fmt.Println( "Key exists in map" ) }
این به شما امکان می دهد تا وجود یک کلید را بدون اختصاص مقدار به یک متغیر تحلیل کنید. این به ویژه زمانی مفید است که مقدار مورد نیاز نباشد اما همچنان می خواهید وجود کلید را تأیید کنید.
سیستم بسته در برو
در Go، یک بسته مجموعه ای از فایل های منبع کامپایل شده از همان دایرکتوری است. این واحد اساسی قابلیت استفاده مجدد کد و سازماندهی در Go است.
بسته ها به شما امکان می دهند پایگاه کد خود را به شیوه ای منطقی و قابل نگهداری ساختار دهید. با بسته ها می توانید به راحتی وابستگی ها را مدیریت کنید و مقدار کدهایی را که باید بنویسید کاهش دهید. همچنین میتوانید از بستهها برای کپسولهسازی کد خود استفاده کنید، اینترفیسهای صریح را فراهم کنید و جزئیات پیادهسازی را مبهم کنید.
چگونه یک بسته را در Go اعلام کنیم
در Go، هر فایل کد با یک اعلان بسته شروع می شود که بسته ای را که فایل به آن تعلق دارد را مشخص می کند. این اعلامیه اغلب به صورت زیر ظاهر می شود:
package mypackage
اگر قرار است بسته ای یک برنامه اجرایی باشد، نام آن باید main.
یکی از اهداف اصلی اعلان بسته، تعیین شناسه پیش فرض آن بسته زمانی است که توسط بسته دیگری وارد می شود.
قراردادهای نامگذاری بسته ها
در زیر برخی از قوانین کنوانسیون نامگذاری برای بسته ها آورده شده است:
نام بسته ها باید مختصر، معنی دار و با حروف کوچک بدون زیرخط یا حروف مختلط نوشته شود.
از نام های کوچک و تک کلمه ای استفاده کنید.
نام بسته نباید با هیچ بسته دیگری در کتابخانه استاندارد Go تداخل داشته باشد.
بسته های داخلی
Go با یک کتابخانه استاندارد غنی با مجموعه ای از بسته ها ارائه می شود که طیف گسترده ای از عملکردها، از جمله مدیریت فایل، اتصال به شبکه و پردازش متن را پوشش می دهد. این کتابخانه به شما اجازه می دهد تا بسیاری از وظایف را بدون نیاز به وابستگی های خارجی انجام دهید.
در زیر برخی از بسته های رایج مورد استفاده قرار می گیرند:
fmt: ورودی/خروجی فرمت شده با عملکردهایی مشابه printf
و scanf
در C.
os : یک رابط مستقل از پلتفرم برای عملکرد سیستم عامل ارائه می دهد.
io: اینترفیس های اساسی برای I/O اولیه.
net/http: اجرای سرویس گیرنده و سرور HTTP.
encoding/json: رمزگذاری و رمزگشایی JSON.
نحوه ایجاد بسته های سفارشی در Go
هنگام ایجاد بسته های سفارشی، برای شما مهم است که از یک ساختار پوشه واضح پیروی کنید. هر بسته در دایرکتوری خودش قرار دارد و نام دایرکتوری باید با نام بسته مطابقت داشته باشد.
نام فایل در یک بسته باید توصیفی باشد و نشان دهنده محتوا یا مفید بودن آنها باشد. نام پوشه ها باید همگی با حروف کوچک و بدون کاراکتر یا زیرخط خاص باشند. main.go به عنوان یک مثال کامل عمل می کند، هیچ کاراکتر یا زیرخط خاصی ندارد و با یک حرف کوچک شروع می شود.
در Go، فقط شناسههایی (توابع، انواع، متغیرها، ثابتها) که با یک حرف بزرگ شروع میشوند خارج از بسته صادر میشوند و قابل دسترسی هستند. این رویکرد کپسولهسازی را فعال میکند، که جزئیات اجرای داخلی را پنهان میکند.
چگونه یک بسته را در Go وارد کنیم
برای وارد کردن یک بسته، از کلمه کلیدی import
و مسیر آن استفاده کنید. می توانید چندین بسته را در داخل پرانتز وارد کنید، که روش معمول انجام آن است.
Import ( "Fmt" "os" )
وارد کردن نقطه به شما امکان میدهد شناسههای بسته را مستقیماً به فضای نام فعلی وارد کنید، بدون اینکه لازم باشد نام بسته را پیشوند آنها کنید. به عنوان مثال:
import . "fmt" func main () { Println( "Hello, world!" ) }
در این مثال، وارد کردن نقطه به ما اجازه میدهد که از تابع Println
مستقیماً بدون پیشوند fmt
استفاده کنیم.
در حالی که به نظر جالب می رسد، باید با احتیاط از آن استفاده کنید، زیرا می تواند باعث سردرگمی شود.
راه دیگر برای وارد کردن بسته، از طریق تکنیک واردات مستعار است. این به شما امکان میدهد پس از وارد کردن، نام یک بسته را تغییر دهید تا از تداخل جلوگیری کنید یا وضوح کد را بهبود ببخشید:
import io "io/ioutil"
در نهایت، می توانید از تکنیک شناسه خالی استفاده کنید. این می تواند در شرایطی مفید باشد که می خواهید بسته ای را صرفاً به دلیل عوارض جانبی آن وارد کنید (مانند مقداردهی اولیه متغیرها یا ثبت انواع).
import _ "net/http/pprof"
چگونه یک بسته را در Go راه اندازی کنیم
راه اولیه برای مقداردهی اولیه یک تابع استفاده از تابع init است. تابع init()
یک تابع ویژه در Go است که به صورت خودکار هنگام وارد کردن بسته اجرا می شود. برای انجام عملیات مقداردهی اولیه در سطح بسته، از جمله راه اندازی پیکربندی و مقداردهی اولیه متغیر استفاده می شود.
وقتی نوبت به ترتیب اولیه سازی می شود، Go اطمینان حاصل می کند که بسته ها به ترتیب خاصی مقداردهی اولیه می شوند:
ابتدا وابستگی ها مقداردهی اولیه می شوند.
توابع init()
در یک بسته به ترتیبی که تعریف شده اند اجرا می شوند.
تابع main()
آخرین زمانی که بسته اصلی اجرا می شود فراخوانی می شود.
این یک Wrap است!
در این مقاله به تحلیل اصطلاح ok کاما و موارد استفاده آن پرداختیم. ما همچنین در مورد بسته ها و قراردادهای نامگذاری صحبت کردیم.
تسلط بر اصطلاح "کاما ok" و درک سیستم بسته Go برای هر توسعه دهنده Go ضروری است. هر دوی این مفاهیم نه تنها خوانایی کد را بهبود میبخشند، بلکه حفظ کد شما را آسانتر و کمتر مستعد خطا میکنند.
ارسال نظر