خانه زبان های برنامه نویسی پکیج در زبان گو؛ هر آن چیزی که باید بدانید! زبان های برنامه نویسی Go نوشته شده توسط: تیم فنی نیک آموز تاریخ انتشار: ۰۶ شهریور ۱۴۰۳ آخرین بروزرسانی: ۰۷ شهریور ۱۴۰۳ زمان مطالعه: 16 دقیقه ۵ (۱) پکیج در زبان گو به عنوان واحد استاندارد برای سازماندهی کدها تلقی میشود. برای مدیریت وابستگیها یا همان Dependencies میتوان از این قابلیت زبان گو استفاده کرد و حتی امکان به اشتراک گذاشتن پکیجها بین فایلها و پروژههای مختلف نیز وجود دارد. با استفاده از پکیجها صرفهجویی زمانی بالایی برای توسعه دهنده به وجود خواهد آمد و مزیت آن ایجاد آسان و استفاده سریع از پکیجها در زبان گو است. در این مطلب سادهترین آموزش ورود به دنیای پکیجها در زبان گو را در اختیار شما قرار خواهیم داد. پکیج ها و اهمیت آنها در زبان گو پکیج ها در زبان گو نقش بسیار مهمی در سازماندهی، نگهداری و توسعه کدها ایفا میکنند و با استفاده از آنها مزایای بی شماری در اختیار توسعهدهندگان قرار دارد. در این بخش کمی بیشتر با اهمیت استفاده از پکیج در زبان گو آشنا خواهیم شد: ساختار و سازماندهی کد اگر تاکنون یک برنامه بزرگ و پیچیده را توسعه دادهاید، حتما میدانید که سازماندهی کدها و ساختارها به صورت دقیق از اهمیت بالایی برخوردار است. در صورت نبود این موضوع، مشکلات زیادی در نگهداری کدها و ایجاد تغییرات روی آنها به وجود خواهد آمد. در کدهای بزرگ میتوان برای رسیدن به برنامهای تمیزتر و قابل فهمتر، کدها را در پکیجهای ساختاریافته گنجاند. افزایش قابلیت استفاده توسعهدهندگان اصلا علاقهای به نوشتن دوباره کدهای مجدد ندارند و تا حد امکان این مدل کدها را داخل پکیج جای میدهند. برای مثال، اگر قرار است یک کانکشن دیتابیس نوشته شود و در بخشهای مختلف برنامه استفاده شود، این نوع کد یکبار آماده شده و در دسترس قرار میگیرد. داخل یک پکیج میتوان این کد را مدیریت کرده و در آینده هر جا نیاز شد آن را به کار برد. کنترل وابستگی ها با استفاده از این قابلیتها میتوان کنترل وابستگیها را نیز انجام داد. این امر کمک خواهد کرد تا با دید بهتری تشخیص دهیم کدام بخش به کدام پکیج نیاز دارد. به این صورت، اگر تغییری در یکی از پکیجها ایجاد شود، تاثیر آن فقط روی بخشهای مرتبط اعمال خواهد شد. نام گذاری و جلوگیری از تداخل از جمله مزایای اساسی پکیجها در زبان گو جلوگیری از تداخلها است. هر پکیج با استفاده از یک namespace خاص مشخص میشود و این ویژگی باعث خواهد شد تا بتوان انواع تابع، داده و نام مشابه را داخل پکیجها مشخص کرد. برای مثال، میتوان تابعی با نام Sum در پکیجهای مختلف داشت و در هر بخش پروژه از آن استفاده کرد. محدود سازی دسترسی ها یکی از قابلیتهای پکیج در زبان گو امکان محدودسازی دسترسیها است. با این قابلیت میتوان مشخص کرد که کدام عناصر در خارج از پکیج و کدام یک داخل آن قابل دسترس هستند. تعریف و ساختار پکیج در زبان گو تعریف ساختار یک پکیج در زبان گو بسیار آسان است و با استفاده از کیورد package میتوان آن را ایجاد کرد. پس از این کیورد نام پکیج قرار میگیرد و در خطوط بعدی میتوان بخشهای بعدی مرتبط با توابع را تعریف کرد. برای مثال، در پکیج زیر که mathutils نام دارد، یک تابع برای عملکرد جمع در زبان گو تعریف خواهد شد: package mathutils // Sum دو عدد صحیح را جمع میکند و نتیجه را برمیگرداند func Sum(a int, b int) int { return a + b } این یک پکیج در زبان گو است. برای تعریف پکیج مورد نظر و شناساندن به پروژه مراحلی وجود دارد که در ادامه مطلب بیشتر با آن آشنا خواهیم شد. نحوه ایجاد و استفاده از پکیج ها در زبان گو برای ایجاد یک پکیچ در زبان گو میتوان یک فرآیند مرحلهبهمرحله را طی کرد. با تسلط بر این فرآیند، شاید در آینده ۶۰ ثانیه تا ایجاد یک پکیج برای پروژه خود وقت نیاز داشته باشید. ایجاد پروژه ابتدا در مسیر مورد نظر یک فولدر ایجاد کنید و با دستور cd به مسیر آن بروید: با این کار، میتوانید پروژه را با دستور زیر استارت بزنید: go mod init goproject ساختاردهی به پروژه پس از تنظیمات اولیه، زمان ساختاردهی به فایلهای پروژه است. به صورت زیر، فولدرها و فایلهای اصلی و ماژول را ایجاد کنید: فایل main.go به صورت زیر خواهد بود: package main import ( "fmt" "goproject/pkg/mathutils" // مسیر صحیح به پکیج mathutils ) func main() { result := mathutils.Sum(3, 5) fmt.Println("Result:", result) } فایل mathutils.go را به صورت زیر ذخیره کنید. این فایل دارای یک تابع برای جمع کردن دو عدد است: package mathutils // Sum دو عدد صحیح را جمع میکند func Sum(a int, b int) int { return a + b } به این صورت، میتوانید روی فایل main.go کلیک کنید و کلید Play در VSCode را فشار دهید. با این کار، پروژه اجرا شده و حاصل جمع دو عدد برایتان در ترمینال نمایش داده خواهد شد: امکان تعریف تابعهای دیگر نیز در پکیج در زبان گو فراهم است. شما میتوانید در فایل mathutils.go یک متد دیگر نیز تعریف کنید تا اینبار عملیات ضرب دو عدد را برایتان محاسبه کند. فایل مورد نظر را باز کنید و مقادیر زیر را در آن قرار دهید: package mathutils // Sum دو عدد صحیح را جمع میکند func Sum(a int, b int) int { return a + b } // Multiply دو عدد صحیح را ضرب میکند func Multiply(a int, b int) int { return a * b } فایل main.go به صورت زیر است تا بتوان از دو تابع جمع و ضرب به صورت همزمان استفاده کرد: package main import ( "fmt" "goproject/pkg/mathutils" // مسیر صحیح به پکیج mathutils ) func main() { sumResult := mathutils.Sum(3, 5) fmt.Println("Sum:", sumResult) multiplyResult := mathutils.Multiply(3, 5) fmt.Println("Multiply:", multiplyResult) } با کلیک کردن روی کلید Play در ادیتور میتوانید خروجی زیر را در ترمینال دریافت کنید: پکیج های استاندارد گو در هر زبان برنامهنویسی پکیجهای استانداردی نیز وجود دارند که میتوان به راحتی از آنها استفاده کرد. این پکیجها شامل بسیاری از توابع آماده هستند که در اکثر پروژههای معمولی و بزرگ مورد استفاده قرار خواهند گرفت. برای مثال، میتوان از پکیج fmt برای فرمتبندی ورودی و خروجی استفاده کرد. یا حتی امکان استفاده از پکیج قدرتمند math برای دسترسی به توابع پیچیده ریاضی فراهم است. پکیج استاندارد fmt در گو برای چاپ یک رشته قالب بندی شده میتوان از پکیج fmt در زبان گو استفاده کرد: package main import ( "fmt" ) func main() { name := "Alice" age := 30 fmt.Printf("My name is %s and I am %d years old.\n", name, age) } با اجرای این کد در زبان گو، خروجی زیر را در ترمینال در اختیار خواهید داشت: پکیج os در زبان گو با استفاده از پکیج استاندارد گو میتوان با سیستمعامل ارتباط گرفت. از جمله قابلیتهای این پکیج دسترسی به متغیرهای محیطی، کار با فایلها و خروج از برنامه است. در مثال زیر، کاربرد این پکیج در زبان گو را در مورد باز کردن یک فایل مشاهده میکنیم: package main import ( "fmt" "os" ) func main() { file, err := os.Open("example.txt") if err != nil { fmt.Println("Error:", err) return } defer file.Close() // کار با فایل fmt.Println("File opened successfully") } با اجرای این تکه کد، خروجی زیر را در ترمینال در اختیار دارید: پکیج net/http در زبان گو کاربرد جذاب و بی نظیری برای net/http تعریف شده است. با استفاده از این قابلیت میتوانید وبسرور بسازید و درخواستهای http را مدیریت کنید. در مثال زیر، یک وبسرور روی پورت ۸۰۸۰ لوکال هاست ایجاد خواهد شد: package main import ( "fmt" "net/http" ) func helloHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, World! I'm Go!") } func main() { http.HandleFunc("/", helloHandler) fmt.Println("Server is running on port 8080") http.ListenAndServe(":8080", nil) } این کد را اجرا کنید تا خروجی را در ترمینال دریافت کنید: اکنون، میتوانید به آدرس لوکال هاست مراجعه کنید تا پیام مورد نظر را مشاهده کنید: پکیج encoding/json در زبان گو از پکیجهای کاربردی در زبان گو میتوان در زمان توسعه برنامههای سرور استفاده کرد. یکی از این قابلیتها encoding/json است که برای کار با دادههای JSON میتوان آن را به کار برد. در مثال زیر، یک سری دیتا با استفاده از این پکیج به ساختار JSON و بالعکس تبدیل میشود: package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age"` } func main() { person := Person{Name: "Alice", Age: 30} jsonData, _ := json.Marshal(person) fmt.Println(string(jsonData)) // از JSON به ساختار Go var newPerson Person json.Unmarshal(jsonData, &newPerson) fmt.Printf("%+v\n", newPerson) } در صورت اجرای این کد، خروجی زیر را در ترمینال در اختیار دارید: پکیج time در زبان گو برای کار با زمان و تاریخ، قابلیتهای متعددی در زبانهای برنامهنویسی وجود دارد. با استفاده از پکیج در زبان گو میتوان این عملیاتها را انجام داد و به نتیجه دلخواه دست پیدا کرد. در مثال زیر، ساعت فعلی دریافت شده و پس از اضافه شدن ۲ ساعت به آن در خروجی به صورت رشته چاپ میشود: package main import ( "fmt" "time" ) func main() { now := time.Now() fmt.Println("Current time:", now) future := now.Add(2 * time.Hour) fmt.Println("Two hours later:", future) fmt.Println("Formatted time:", now.Format("2006-01-02 15:04:05")) } خروجی برای این کد به صورت زیر است: پکیج strconv در زبان گو در صورتی که حین توسعه کد نیاز به تبدیل دادهها به رشته یا برعکس را داشته باشید، strconv به کمکتان خواهد آمد. روش کار با این پکیج در زبان گو آسان است و به صورت زیر میتوان از آن استفاده کرد: package main import ( "fmt" "strconv" ) func main() { str := "123" num, err := strconv.Atoi(str) if err != nil { fmt.Println("Error:", err) } else { fmt.Println("Converted number:", num) } numStr := strconv.Itoa(456) fmt.Println("Converted string:", numStr) } با اجرای این کد خروجی زیر در ترمینال به صورت زیر چاپ خواهد شد: کاربرد مهم پکیج در زبان گو احتمالا بدانید زبان گو یکی از زبانهای توسعه بکند وب است. به همین دلیل است که از این قابلیت میتوان برای ارتباط گرفتن با دیتابیس و مدیریت دیتا استفاده کرد. یکی از کاربردهای اساسی پکیج در زبان گو ایجاد اتصال با دیتابیس و مدیریت درخواستها است. در این بخش با این کاربرد بینظیر آشنا خواهیم شد. قبل از هر کاری، بسته نرم افزاری XAMPP را روی سیستم خود نصب کنید و از فعال بودن وبسرور و دیتابیس MySQL اطمینان حاصل کنید: برای ارتباط گرفتن با دیتابیس نیاز به ساخت آن داریم. به صورت زیر روی Admin کلیک کنید تا به محیط مدیریتی وارد شوید: در این بخش روی گزینه phpMyAdmin کلیک کنید تا وارد بخش دیتابیسها شوید: در این بخش روی گزینه new کلیک کنید تا یک دیتابیس جدید بسازیم: نام دلخواه را انتخاب کنید و روی گزینه create کلیک کنید: به این صورت، دیتابیس ساخته شده و در قسمت سمت چپ نمایش داده خواهد شد: یک کوئری نیاز داریم تا جدول مربوط به user را داخل این دیتابیس ایجاد کنیم: کوئری مورد نظر به صورت زیر است که جدول user را با دو ردیف id و name ایجاد خواهد کرد: با کلیک کردن روی گزینه Go، پیام موفقیت به صورت زیر خواهد بود: با کلیک روی جدول ایجاد شده میتوانید ردیفهای مرتبط با آن را مشاهده کنید: برای کار با پکیج ارتباط با دیتابیس، یک فولدر برای پروژه ایجاد کنید که ما در اینجا نام godb را انتخاب کردهایم. دستور زیر را داخل این فولدر اجرا کنید تا فایل مرتبط با پروژه ساخته شود: go mod init godb اکنون ساختار زیر را برای پروژه ارتباط با دیتابیس ایجاد کنید تا بتوانیم از قابلیت پکیج در زبان گو برای اتصال به آن استفاده کنیم: البته، به یک درایور نیز نیاز داریم تا با استفاده از آن کانکشن دیتابیس MySQL را ایجاد کنیم. به صورت زیر میتوان این درایور را نصب کرد: go get -u github.com/go-sql-driver/mysql فایل main.go به صورت زیر است: // مسیر: /godb/cmd/main.go package main import ( "fmt" "godb/pkg/db" "log" ) func main() { // اطلاعات اتصال به دیتابیس user := "root" password := "" dbname := "godb" // ایجاد اتصال به دیتابیس database, err := db.NewDatabase(user, password, dbname) if err != nil { log.Fatal("Cannot connect to database:", err) } defer database.Close() // اجرای یک کوئری SELECT rows, err := database.ExecuteQuery("SELECT id, name FROM users") if err != nil { log.Fatal("Error executing query:", err) } defer rows.Close() for rows.Next() { var id int var name string if err := rows.Scan(&id, &name); err != nil { log.Fatal("Error scanning row:", err) } fmt.Printf("ID: %d, Name: %s\n", id, name) } // اجرای یک کوئری INSERT result, err := database.ExecuteNonQuery("INSERT INTO users (name) VALUES (?)", "John Smith") if err != nil { log.Fatal("Error executing non-query:", err) } lastInsertID, _ := result.LastInsertId() fmt.Printf("New record ID: %d\n", lastInsertID) } فایل mysql.go به صورت زیر خواهد بود: // مسیر: /godb/pkg/db/mysql.go package db import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) type Database struct { Conn *sql.DB } // NewDatabase یک اتصال جدید به دیتابیس را برمیگرداند func NewDatabase(user, password, dbname string) (*Database, error) { dsn := fmt.Sprintf("%s:%s@tcp(127.0.0.1:3306)/%s", user, password, dbname) db, err := sql.Open("mysql", dsn) if err != nil { return nil, err } // بررسی اتصال if err := db.Ping(); err != nil { return nil, err } return &Database{Conn: db}, nil } // Close اتصال به دیتابیس را میبندد func (d *Database) Close() error { return d.Conn.Close() } // ExecuteQuery یک کوئری را اجرا میکند و نتیجه را برمیگرداند func (d *Database) ExecuteQuery(query string, args ...interface{}) (*sql.Rows, error) { return d.Conn.Query(query, args...) } // ExecuteNonQuery یک کوئری غیر انتخابی را اجرا میکند (INSERT, UPDATE, DELETE) func (d *Database) ExecuteNonQuery(query string, args ...interface{}) (sql.Result, error) { return d.Conn.Exec(query, args...) } فایل main.go را اجرا کنید تا یک رکورد جدید با نام “John Smith” داخل دیتابیس ذخیره شود: اکنون، با مراجعه به کنترل پنل دیتابیس میتوانید رکورد ایجاد شده را مشاهده کنید: پس از ایجاد پکیج در زبان گو، هر جا که به اتصال با دیتابیس نیاز بود، میتوانید تابع را فراخوانی کرده و عملیات مورد نظر را انجام دهید. بهترین شیوه ها در مدیریت پکیج ها برای مدیریت پکیج در زبان گو میتوان از روشهای مختلفی استفاده کرد. یکی از بهترین روشها بردن کدها روی پلتفرمهایی مانند github است. به این صورت، به راحتی میتوان کنترل نسخه را نیز انجام داده و در آینده بهینه سازیهای مورد نظر را روی کدها اعمال کرد. همچنین، شما میتوانید کدهای خود را روی سیستم شخصی نیز نگهداری کنید تا در صورت نیاز آن را در پروژههایتان استفاده کنید. تست پکیج ها در زبان گو پس از آماده کردن کدها مطمئنا نیاز است تا تستهای مختلف نیز روی آنها اعمال شود. تستها روشی مطمئن هستند تا بتوان خطاها را قبل از مرحله Production برطرف کرد. شما میتوانید از پکیجهایی مانند testing یا gomock استفاده کنید تا تستهای مطمئن و قابل اتکایی را روی برنامهتان اعمال کنید. جمع بندی: پکیج در زبان گو پکیج در زبان گو یک قابلیت ارزنده و ضروری است. پس از آموزش این قابلیت و تسلط روی آن به راحتی میتوانید از آن در پروژههای کوچک و بزرگ خود استفاده کنید. این قابلیت کمک خواهد کرد تا در زمان توسعه کدها نیز صرفهجویی بالایی را به دست آورید. در صورت نیاز، امکان دانلود سایر پکیجهای آماده نیز از پلتفرمهایی مانند گیتهاب وجود دارد و این کار در چند ثانیه امکانپذیر است. چه رتبه ای میدهید؟ میانگین ۵ / ۵. از مجموع ۱ اولین نفر باش معرفی نویسنده مقالات 402 مقاله توسط این نویسنده محصولات 0 دوره توسط این نویسنده تیم فنی نیک آموز معرفی محصول اکبر رضاییان قانع دوره شروع کار با گولنگ 1.100.000 تومان مقالات مرتبط ۱۰ آبان زبان های برنامه نویسی عملکرد کتابخانه Turtle در پایتون و کاربرد های آن ۰۸ آبان زبان های برنامه نویسی Migration در لاراول چیست و چه کاربردهایی دارد؟ تیم فنی نیک آموز ۰۷ آبان زبان های برنامه نویسی مفهوم SDK در برنامه نویسی اندروید چیست؟ تیم فنی نیک آموز ۰۱ آبان زبان های برنامه نویسی HierarchyId در Ef Core 8؛ کامل ترین آموزش برای مدیریت دیتاهای ساختار یافته تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ