در Go، یک برنامه در قالب پکیجها سازماندهی میشود. «پکیج» مجموعهای از فایلهای منبع است که در یک پوشهی یکسان قرار دارند. همهی فایلهای منبع در یک پوشه باید در بالای فایل، نام پکیج یکسانی داشته باشند. طبق قرارداد، نام پکیجها همان نام پوشهای است که در آن قرار دارند.
package greeting
Go یک کتابخانهی استاندارد گسترده از پکیجها ارائه میدهد که میتوانید با استفاده از کلیدواژهی import در برنامهتان به کار ببرید.
پکیجهای کتابخانهی استاندارد با نامشان وارد میشوند.
package greeting
import "fmt"
سپس به پکیج واردشده با نام پکیج ارجاع داده میشود:
world := "World"
fmt.Sprintf("Hello %s", world)
Go بر اساس نحوهی اعلان یک مورد تعیین میکند که آیا کد موجود در پکیجهای دیگر میتواند آن را فراخوانی کند یا نه.
برای اینکه یک تابع، نوع، متغیر، ثابت یا فیلد struct از بیرون قابل مشاهده باشد (که به آن «صادرشده» میگویند)، نام باید با حرف بزرگ شروع شود.
package greeting
// Hello is a public function (callable from other packages).
func Hello(name string) string {
return "Hello " + name
}
// hello is a private function (not callable from other packages).
func hello(name string) string {
return "Hello " + name
}
Go پکیجی داخلی به نام fmt (پکیج قالببندی) ارائه میدهد که توابع متنوعی برای دستکاری قالب ورودی و خروجی در اختیار میگذارد.
پرکاربردترین تابع Sprintf است که با استفاده از فعلهایی مانند %s مقادیر را درون یک رشته جایگذاری میکند و همان رشته را برمیگرداند.
import "fmt"
food := "taco"
fmt.Sprintf("Bring me a %s", food)
// Returns: Bring me a taco
در Go، مقادیر اعشاری بهراحتی با فعلهای Sprintf قالببندی میشوند: %g (نمایش فشرده)، %e (نمایی) یا %f (غیرنمایی).
هر سه فعل امکان کنترل عرض میدان و موقعیت عددی را فراهم میکنند.
import "fmt"
number := 4.3242
fmt.Sprintf("%.2f", number)
// Returns: 4.32
فهرست کامل فعلهای موجود را میتوانید در مستندات پکیج قالببندی ببینید.
fmt توابع دیگری هم برای کار با رشتهها دارد، مانند Println که صرفاً آرگومانهای دریافتی را در کنسول چاپ میکند و Printf که ورودی را پیش از چاپ، همانند Sprintf قالببندی میکند.
روزی روزگاری برنامهنویسی عجیبوغریب در خانهای غریب با پنجرههای میلهدار زندگی میکرد. یک روز، از یک سایت آگهی استخدام آنلاین کاری گرفت تا یک ربات مهمانی بسازد. قرار است این ربات به مردم خوشآمد بگوید و آنها را تا سر میزشان همراهی کند. نسخهی اول بسیار فنی بود و نشان میداد که برنامهنویس در تعامل با انسانها مهارتی ندارد. بخشی از آنها هم به نسخهی بعدی راه پیدا کرد.
تابع Welcome را طوری پیادهسازی کنید که با استفاده از اسم دادهشده پیام خوشآمدگویی برگرداند:
Welcome("Christiane")
// => Welcome to my party, Christiane!
تابع HappyBirthday را طوری پیادهسازی کنید که با استفاده از اسم و سن دادهشدهی شخص، پیام تولد برگرداند.
متأسفانه برنامهنویس کمی خودنمایی میکند، بنابراین ربات باید دانش خود را دربارهی تولد هر مهمان به نمایش بگذارد.
HappyBirthday("Frank", 58)
// => Happy birthday Frank! You are now 58 years old!
تابع AssignTable را برای نشان دادن مسیر پیادهسازی کنید.
این تابع باید ۵ پارامتر بگیرد.
string)int)string)string)float64)قالب دقیق نتیجه را در مثال زیر میبینید.
ربات شمارهی میز را در قالب ۳ رقمی ارائه میدهد. اگر عدد کمتر از ۳ رقم باشد، صفرهای اضافی به ابتدای آن اضافه میشود تا ۳ رقمی شود (مثلاً 3 به 003 تبدیل میشود). ربات فاصلهی میز را هم ذکر میکند. خوشبختانه فقط با دقتی که به ۱ رقم محدود است.
AssignTable("Christiane", 27, "Frank", "on the left", 23.7834298)
// =>
// Welcome to my party, Christiane!
// You have been assigned to table 027. Your table is on the left, exactly 23.8 meters from here.
// You will be sitting next to Frank.