Go banner

۱۰ قابلیت دوست‌داشتنی Go

زبان برنامه‌نویسی Go این ماه ۱۰ ساله میشه و در ادامه، ۱۰ تا از قابلیت‌های خوب این زبان دوست‌داشتنی رو می‌خونید.

Map به‌طور پیش‌فرض دارای مقدار صفر است

وقتی از Map استفاده می‌کنیم، حتی اگر یک کلید رو مقداردهی هم نکنیم، می‌توان اون کلید رو دریافت کرد و مقدار اون (به‌جای این‌که nil باشه)، مساوی با «مقدار صفر» (Zero Value) نوع داده اون مپ هستش. مگر این‌که دارای نوع داده «پوینتر» باشه (که در این‌صورت مقدار پیش‌فرض، nil هستش).

بنابراین اگر یک مپ m := map[string]int داشته باشیم، وقتی m["hello"] رو دریافت کنیم، نتیجه برابر با 0 خواهد بود، اگرچه ما کلید hello رو واقعا وارد نکرده باشیم.

در این‌جا 0 مقدار صفر int هستش. اگر مپ ما از نوع string باشه، مقدار کلید مساوی با "" (متن خالی) هستش، یا اگه نوع مپ bool بود، مقدار کلیدها به‌طور پیش‌فرض، مساوی با false خواهد بود.

این‌طوری دیگه نیاز نیست برای کار با یک کلید، ابتدا بررسی کنیم که اون کلید در مپ موجود هست یا خیر. که نهایتاً کد ما تمیز و مرتب‌تر میشه. فرض کنید که می‌خواهیم تعداد تکرار هر کاراکتر در یک رشته متنی رو بشماریم، این کار به‌سادگی قابل انجام هست:

func count(input string) (map[string]int) {
    m := map[string]int{}
    for _,s := range input {
           m[string(s)]++ // always a safe operation
    }
    return m
}

بنابراین نیاز نیست قبل از افزودن شمارنده (در سطر ۴)، بررسی کنیم که کلید string(s) از قبل در مپ موجود هست یا خیر.

مقادیر تغییرناپذیر

به‌طور پیش‌فرض، وقتی مقداری را به یک فانکشن یا متد پاس می‌دهید، نمی‌توان آن مقدار را تغییر داد. اگر قصد دارید مقدار رو تغییر بدید، باید یک «پوینتر به اون مقدار» رو به فانکشن یا متد پاس دهید. زبان Go به‌اندازه زبان Rust اون‌قدر سخت‌گیرانه نیست که تغییرپذیر بودن یا نبودن یک متغیر رو در هنگام تعریف اون باید مشخص کنیم. با این حال، وقتی یک فانکشن رو صدا می‌کنید که یک پوینتر دریافت نمی‌کنه، می‌تونید مطمئن باشید که مقدار پاس داده شده به اون فانکشن، هرگز تغییر نمی‌کنه.

مقادیر به‌طور پیش‌فرض Nil نیستند

من طرفدار NULL در هیچ زبانی نیستم، بنابراین بسیار خوشحالم که به‌صورت پیش‌فرض، Structها و مقادیر پایه، هیچ‌گاه به Nil اشاره نمی‌کنند، که ما رو از نوشتن بسیاری از دستورات بررسی Nil بودن/نبودن یک مقدار، بی‌نیاز می‌کنه. مگر این‌که از پوینتر استفاده کنید، در این صورت وجود تمامی دستورات بررسی و رسیدگی به خطاها، کاملا ضروری است.

type myStruct struct {} 
func magic(m myStruct) {
     // no pointer, guaranteed that m is not nil
}
func magicp(m *myStruct) {
     // could cause nilpointers!
}

اسلایس Nil و اسلایس خالی یکسان هستند

یک نکته دیگه در مورد Nil این‌که وقتی یک Nil Slice دارید، اساساً تفاوتی با یک slice خالی (غیر Nil) ندارد. بنابراین نیازی نیست که هم Nil بودن و هم خالی بودن یک اسلایس رو بررسی کنید.

func main() {
     var s []int
     if len(s) == 0 {
        fmt.Println("hello")
     }
}

انتشار آسان کتابخانه‌ها

این چیزیه که هیچوقت به‌عنوان یک مسأله مهم بهش فکر نکرده بودم، تا این‌که متوجه شدم انجام این‌کار در Go بی‌اندازه راحت و آسون هستش. من تعدادی کتابخانه Go نوشتم و به‌معنی واقعی کلمه، تنها کاری که باید می‌کردم این بود که کد رو در گیت‌هاب پوش کنم. بعد از اون دیگران می‌تونن با دستور go get github.com/{username}/{lib} کتابخانه من رو دریافت کنند. این روزها کتابخانه‌ها رو به‌صورت Go Module به پروژه اضافه می‌کنید، اما این هم به همون سادگی انتشار در گیت‌هاب هستش.

خودسر است

این چیزیه که شما یا عاشقش هستید یا ازش متنفرید. طراحی Go خودسرانه است. هدف این نبوده که همه رو راضی نگه داره، برعکس تلاش بر این بوده که تا میشه زبان کوچکی باشه و قابلیت‌های ضروری رو شامل بشه. Go بسیاری از قابلیت‌های کم کاربرد زبان‌های دیگه رو نداره، در عوض یک زبان کوچک و ساده و بسیار سریع و پر قدرت است.

برنامه‌نویسی مولتی پارادایم

بسیاری از کدهای نوشته شده در Go به شی‌ءگرایی گرایش دارند، اما شیء‌گرایی یک ضرورت نیست. در حقیقت زبان Go کاملاً از برنامه‌نویسی فانکشنال (تابعی) پشتیبانی می‌کند.

جامعه برنامه‌نویسان Go

در هر جایی، از IRC و gophers.slack.com گرفته، تا میتینگ‌ها و کنفرانس‌ها، شما می‌توانید افرادی عالی را بیابید که عمیقاً درباره زبان Go اهمیت قائلند. آن‌ها با افراد تازه‌کار برخورد بسیار مناسبی دارند و به کسانی که یادگیری Go را شروع کرده‌اند کمک می‌کنند.

افزون بر این، تشکل‌ها و انجمن‌های بسیار خوب، جامع و متنوعی مانند GoBridge و Women Who Go وجود دارند.

همه‌جا اجرا می‌شود

برنامه‌های نوشته شده با Go تقریباً همه‌جا اجرا می‌شوند. و شما می‌توانید با استفاده از سویچ‌های GOOS، GOARCH، CGO_ENABLED و GOARM آن را برای هر معماری و پلتفرمی کامپایل کنید.

علاوه بر این، Go از اولین زبان‌های برنامه‌نویسی است که قابلیت کامپایل به WebAssembly را به‌طور پیش‌فرض داراست.

به‌علاوه، تشکل‌هایی در جامعه برنامه‌نویسان Go وجود دارند که تلاش می‌کنند Go را حتی قابل حمل‌تر و قابل اجرا در طیف وسیع‌تر و متنوع‌تری از دستگاه‌ها کنند. مانند پروژه خارق‌العاده TinyGo.

به‌طور عمدی ساده طراحی شده است

یکی از اهداف اصلی طراحی Go ساده بودن آن بوده است و تا به حال توانسته همین‌طور باقی بماند. شما می‌توانید در مدت زمان نسبتاً کوتاهی مشخصات و جزئیات کامل این زبان را مطالعه کنید. این بدان معنی‌ست که برخی قابلیت‌هایی که در زبان‌های دیگر هست، در Go وجود ندارد. مهم‌ترین آن‌ها Generics است.

سادگی زبان Go بسیار مهم و مفید است. افراد می‌توانند به‌سرعت این زبان را فراگیرند. همچنین احتمال این‌که همکار شما از چیزی استفاده کند که شما تابحال ندیده باشید، بسیار کم است.

به‌علاوه، داشتن مشخصات ساده به این معنی‌ست که پیاده‌سازی کامپایلرهای مختلف برای این زبان راحت‌تر است. مانند TinyGo و GccGo.

این مقاله ترجمه‌ای آزاد از مقاله دیگری به‌همین نام است.

پاسخی بگذارید

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