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 که در کتابخانه استاندارد گو وجود دارد استفاده کردیم. این به این معنی است همراه با تعریف کلمه 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"

اما با تشکر از زبان گو, ما می‌توانیم چندین پکیج رو به صورت زیر و فقط با یک بار نوشتن کلید واژه import فراخوانی کنیم:

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

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

همینطور ما می‌توانیم به پکیج هایی که import کردیم یک alias هم بدیم، یعنی همون اسم مستعار, به مثال زیر توجه کنید:

1import (
2	format "fmt"
3)

و مانند مثال زیر از آن ها استفاده کنیم:‌

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

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

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

 1package main  
 2  
 3import "encoding/json"  
 4  
 5type jSON struct {  
 6    Name string `json:"name"`  
 7}  
 8  
 9func main() {  
10    var data []byte  
11    json.Unmarshal(data, &jSON{})  
12}

چون پکیج json نیاز داره تا فیلد Name رو تغییر بده پس در نتیجه در کد بالا حتما باید این فیلد رو با حرف بزرگ می‌نوشتیم.

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 وقتی بداند شما پکیجی را تعریف کردید و استفاده نکردید آن را خودکار پاک می‌کند. البته که کد ادیتورهای معروف هم مانند goland,vsCode و …، همین کارو رو در حین نوشتن کد برای شما انجام می‌دهند.)

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

1$ go mod tidy

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