1.12 اضافه کردن پکیج در کد (package)

1.12 اضافه کردن پکیج در کد (package)

زبان برنامه نویسی گو به شکلی طراحی شده است تا بتوانیم شیو‌ه های خوب مهندسی نرم افزار را به خوبی و ساده پیاده سازی کنیم. یکی از الگوهای مهم برای ارتقای کیفیت یک نرم افزار استفاده از DRY principle است. کلمه DRY مخفف Don’t Repeat Yourself است. که به صورت خیلی ساده یعنی کدی که خواهید نوشت را دوبار تکرار نکنید. تا جایی که امکان دارد باید از کدهای قبلی که نوشته اید بتوانید استفاده کنید. پکیج‌ها امکاناتی از جمله:

  • قابلیت استفاده مجدد از کد را به ما میدهند.
  • امکان ماژولار، و قابل نگهداری را فراهم می‌کنند.
  • امکان مدیریت بهتر فایل‌ها را در یک واحد ایجاد می‌کنند.

1.12.1 پکیج‌ها در زبان گو #

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

1package <packagename>

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

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

1.12.2 اضافه کردن پکیج #

برای اضافه کردن پکیج‌های مختلف ما از کلید واژه import استفاده می‌کنیم.

1import "fmt"

برای مثال در کد بالا ما از پکیج استاندارد هسته گو استفاده کریدم. این به این معنی است همراه با تعریف کلمه fmt میتوانیم از توابعی که داخل این پکیج استفاده شده است استفاده کنیم. در مثال زیر ما از تابع Println برای چاپ مقدارHello GoFarsi!‍ استفاده کردیم.

1package main
2
3import "fmt"
4
5func main() {
6	fmt.Println("Hello GoFarsi!")
7}

تعریف کردن توابع به این شکل مزایای زیادی دارد از جمله:

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

1.12.2.1 اضافه کردن چندین پکیج #

ما می‌توانیم برای اضافه کردن هر پکیج از کلید واژه import به شکل زیر استفاده کنیم :

1import "fmt"
2import "time"
3import "math"
4import "math/rand"

اما با تشکر از گو ما میتوانیم کلیدواژهایی که قرار است بیشتر از یک بار اجرا شوند را به شکل زیر نیز تعریف کنید:

1import (
2	"fmt"
3	"time"
4	"math"
5    "math/rand"
6)

یعنی یک بار از کلیدواژ import استفاده کنیم و بعد اسم پکیج ها را به ترتیب داخل آن بنویسیم.

1.12.3 اسم های عمومی و خصوصی (Export و Unexport) #

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

برای مثال کد زیر را مشاهده کنید:

 1package main
 2
 3import (
 4	"fmt"
 5	"math"
 6)
 7
 8func main() {
 9	fmt.Println(math.MaxInt64) // result: 9223372036854775807
10}

در کد بالا ما از دو پکیج fmt و math استفاده کردیم. تابع Println از پکیج fmt به دلیل اینکه اولین حرف آن بزرگ است ما می‌توانیم داخل پکیج main خود از آن تابع استفاده کنیم. و برای پکیج math دقیقا بخاطر آنکه اول حرف MaxInt64 بزرگ است می‌توانیم از آن استفاده کنیم.

حالا فرض کنیم که داخل پکیج math ما می‌خواهیم عدد pi را برگردانیم و ممکن است این متغییر فقط داخل این پکیج تعریف شده باشد پس اگر کاراکتر اول را به صورت کوچک بذاریم با خطا مواجه خواهیم شد:

 1package main
 2
 3import (
 4	"fmt"
 5	"math"
 6)
 7
 8func main() {
 9	fmt.Println(math.MaxInt64) 
10	fmt.Println(math.pi) 
11}
12
13// result:
14./prog.go:10:19: undefined: math.pi
15Go build failed.

برای حل خطای بالا کافی است pi را به Pi تغییر دهید.

1.12.4 اضافه کردن پکیج‌های 3rd party #

فرض کنید می‌خواهیم از پکیج Gin (github.com) می‌خواهیم استفاده کنیم برای اضافه کردن این پکیج ما ‌می‌توانیم به دو شکل زیر آن را اضافه کنیم.

داخل پروژه خود از دستور زیر استفاده کنید:

1$ go get -u github.com/gin-gonic/gin

بعدا می‌توانید وارد پروژه خود شوید و با کلید واژه import از آن استفاده کنید به شکل زیر :

 1package main
 2
 3import (
 4  "net/http"
 5
 6  "github.com/gin-gonic/gin"
 7)
 8
 9func main() {
10  r := gin.Default()
11  r.GET("/ping", func(c *gin.Context) {
12    c.JSON(http.StatusOK, gin.H{
13      "message": "pong",
14    })
15  })
16  r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
17}

حالت دیگر استفاده از go mod tidy است به این شکل که ما از دستور go get استفاده نمیکنیم. و همان مستقیم داخل پروژه آدرس gin را داخل import وارد میکنیم.

و همان ابتدا داخل کد یک فانکشن را با همان پکیج فراخوانی میکنیم (اینکار لازم است چون همانطور که می دانید خود go tool وقتی بداند شما پکجی را تعریف کردید و استفاده نکردید آن را اتوماتیک پاک میکند.)

سپس از دستور زیر استفاده میکنیم:

1$ go mod tidy

این دستور کل کدهای شما را بررسی می‌کند و اگر ببینید پکیجی تعریف شده است و شما آن را ندارید سعی میکند آن پکیج را برای شما دانلود و به پروژه شما اضافه کند.