پکیج در زبان گو؛ هر آن چیزی که باید بدانید!

پکیج در زبان گو؛ هر آن چیزی که باید بدانید!

نوشته شده توسط: تیم فنی نیک آموز
تاریخ انتشار: ۰۶ شهریور ۱۴۰۳
آخرین بروزرسانی: ۰۷ شهریور ۱۴۰۳
زمان مطالعه: 16 دقیقه
۵
(۱)

پکیج در زبان گو به عنوان واحد استاندارد برای سازماندهی کدها تلقی می‌شود. برای مدیریت وابستگی‌ها یا همان Dependencies می‌توان از این قابلیت زبان گو استفاده کرد و حتی امکان به اشتراک گذاشتن پکیج‌ها بین فایل‌ها و پروژه‌های مختلف نیز وجود دارد. با استفاده از پکیج‌ها صرفه‌جویی زمانی بالایی برای توسعه دهنده به وجود خواهد آمد و مزیت آن ایجاد آسان و استفاده سریع از پکیج‌ها در زبان گو است. در این مطلب ساده‌ترین آموزش ورود به دنیای پکیج‌ها در زبان گو را در اختیار شما قرار خواهیم داد.

دوره شروع کار با GO نیک آموز

پکیج ها و اهمیت آنها در زبان گو 

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

ساختار و سازماندهی کد

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

افزایش قابلیت استفاده 

توسعه‌دهندگان اصلا علاقه‌ای به نوشتن دوباره کدهای مجدد ندارند و تا حد امکان این مدل کدها را داخل پکیج جای می‌دهند. برای مثال، اگر قرار است یک کانکشن دیتابیس نوشته شود و در بخش‌های مختلف برنامه استفاده شود، این نوع کد یکبار آماده شده و در دسترس قرار می‌گیرد. داخل یک پکیج می‌توان این کد را مدیریت کرده و در آینده هر جا نیاز شد آن را به کار برد. 

کنترل وابستگی ها 

با استفاده از این قابلیت‌ها می‌توان کنترل وابستگی‌ها را نیز انجام داد. این امر کمک خواهد کرد تا با دید بهتری تشخیص دهیم کدام بخش به کدام پکیج نیاز دارد. به این صورت، اگر تغییری در یکی از پکیج‌ها ایجاد شود، تاثیر آن فقط روی بخش‌های مرتبط اعمال خواهد شد. 

نام گذاری و جلوگیری از تداخل 

از جمله مزایای اساسی پکیج‌ها در زبان گو جلوگیری از تداخل‌ها است. هر پکیج با استفاده از یک 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)
}

 

با اجرای این کد در زبان گو، خروجی زیر را در ترمینال در اختیار خواهید داشت:

 

پکیج استاندارد fmt در گو

 

پکیج 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")

}

 

با اجرای این تکه کد، خروجی زیر را در ترمینال در اختیار دارید:

 

پکیج os در زبان گو

 

پکیج 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)
}

 

این کد را اجرا کنید تا خروجی را در ترمینال دریافت کنید:

 

پکیج net/http در زبان گو

 

اکنون، می‌توانید به آدرس لوکال هاست مراجعه کنید تا پیام مورد نظر را مشاهده کنید:

 

لوکال هاست

 

پکیج 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)
}

 

در صورت اجرای این کد، خروجی زیر را در ترمینال در اختیار دارید:

 

پکیج encoding/json در زبان گو

 

پکیج 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"))
}

 

خروجی برای این کد به صورت زیر است:

 

پکیج time در زبان گو

 

پکیج 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)
}

 

با اجرای این کد خروجی زیر در ترمینال به صورت زیر چاپ خواهد شد:

 

پکیج strconv در زبان گو

 

کاربرد مهم پکیج در زبان گو

احتمالا بدانید زبان گو یکی از زبان‌های توسعه بکند وب است. به همین دلیل است که از این قابلیت می‌توان برای ارتباط گرفتن با دیتابیس و مدیریت دیتا استفاده کرد. یکی از کاربردهای اساسی پکیج در زبان گو ایجاد اتصال با دیتابیس و مدیریت درخواست‌ها است. در این بخش با این کاربرد بی‌نظیر آشنا خواهیم شد. 

قبل از هر کاری، بسته نرم افزاری XAMPP را روی سیستم خود نصب کنید و از فعال بودن وب‌سرور و دیتابیس MySQL اطمینان حاصل کنید:

 

نصب XAMPP

 

برای ارتباط گرفتن با دیتابیس نیاز به ساخت آن داریم. به صورت زیر روی Admin کلیک کنید تا به محیط مدیریتی وارد شوید:

 

ارتباط گرفتن با دیتابیس

 

در این بخش روی گزینه phpMyAdmin کلیک کنید تا وارد بخش دیتابیس‌ها شوید:

 

phpMyAdmin

 

در این بخش روی گزینه new کلیک کنید تا یک دیتابیس جدید بسازیم:

 

ساخت دیتابیس جدید

 

نام دلخواه را انتخاب کنید و روی گزینه create کلیک کنید:

 

ساخت دیتابیس جدید

 

به این صورت، دیتابیس ساخته شده و در قسمت سمت چپ نمایش داده خواهد شد:

 

نمایش دیتابیس ساخته شده

 

یک کوئری نیاز داریم تا جدول مربوط به user را داخل این دیتابیس ایجاد کنیم:

 

جدول مربوط به user

 

کوئری مورد نظر به صورت زیر است که جدول user را با دو ردیف id و name ایجاد خواهد کرد:

 

اطلاعات مربوط به user

 

با کلیک کردن روی گزینه 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” داخل دیتابیس ذخیره شود:

 

اجرای فایل main.go

 

اکنون، با مراجعه به کنترل پنل دیتابیس می‌توانید رکورد ایجاد شده را مشاهده کنید:

 

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

 

پس از ایجاد پکیج در زبان گو، هر جا که به اتصال با دیتابیس نیاز بود، می‌توانید تابع را فراخوانی کرده و عملیات مورد نظر را انجام دهید. 

بهترین شیوه ها در مدیریت پکیج ها

برای مدیریت پکیج در زبان گو می‌توان از روش‌های مختلفی استفاده کرد. یکی از بهترین روش‌ها بردن کدها روی پلتفرم‌هایی مانند github است. به این صورت، به راحتی می‌توان کنترل نسخه را نیز انجام داده و در آینده بهینه سازی‌های مورد نظر را روی کدها اعمال کرد. 

همچنین، شما می‌توانید کدهای خود را روی سیستم شخصی نیز نگهداری کنید تا در صورت نیاز آن را در پروژه‌هایتان استفاده کنید. 

تست پکیج ها در زبان گو 

پس از آماده کردن کدها مطمئنا نیاز است تا تست‌های مختلف نیز روی آن‌ها اعمال شود. تست‌ها روشی مطمئن هستند تا بتوان خطاها را قبل از مرحله Production برطرف کرد. شما می‌توانید از پکیج‌هایی مانند testing یا gomock استفاده کنید تا تست‌‌های مطمئن و قابل اتکایی را روی برنامه‌تان اعمال کنید.  

جمع بندی: پکیج در زبان گو 

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

چه رتبه ای می‌دهید؟

میانگین ۵ / ۵. از مجموع ۱

اولین نفر باش

title sign
معرفی نویسنده
تیم فنی نیک آموز
مقالات
402 مقاله توسط این نویسنده
محصولات
0 دوره توسط این نویسنده
تیم فنی نیک آموز
title sign
دیدگاه کاربران