تتكون حزمة Go من ملفات Go الموجودة في نفس الدليل ، والتي يوجد في البداية نفس تعبير 
package . تتيح لك الحزم التي تتصل بالبرامج توسيع قدراتها. بعض الحزم جزء من مكتبة Go القياسية. هذا يعني أنه إذا كنت تستخدم Go ، فهي مثبتة بالفعل. يتم تثبيت الحزم الأخرى باستخدام الأمر 
go get . يمكنك أيضًا كتابة حزم Go الخاصة بك ، وإنشاء ملفات في أدلة خاصة ، والالتزام بقواعد تصميم الحزمة.

المواد ، التي نُنشر ترجمتها اليوم ، هي دليل لتطوير حزم Go-go التي يمكن توصيلها بملفات أخرى.
المتطلبات الأساسية
- قم بإعداد بيئة برامج Go (تعرف على كيفية القيام بذلك هنا ). قم بإنشاء مساحة عمل Go (النقطة الخامسة من المادة أعلاه مخصصة لهذا). في القسم التالي من هذه المادة ، يمكنك العثور على أمثلة يوصى بإعادة إنتاجها في المنزل. حتى تتمكن من التعامل معهم بشكل أفضل.
- لتعميق معرفتك بـ GOPATH- ألق نظرة على هذه المادة.
كتابة واستيراد الحزم
كتابة رمز الحزمة هو نفس كتابة رمز Go المعتاد. يمكن أن تحتوي الحزم على إعلانات للوظائف والأنواع والمتغيرات ، والتي يمكن استخدامها بعد ذلك في برامج Go الأخرى.
قبل أن نتمكن من البدء في إنشاء حزمة جديدة ، نحتاج إلى الانتقال إلى مساحة عمل Go. إنه موجود على المسار المحدد بواسطة متغير 
GOPATH . على سبيل المثال ، اسمح لمنظمتنا أن تسمى 
gopherguides . في الوقت نفسه ، نحن ، كمستودع ، نستخدم 
GitHub . هذا يؤدي إلى حقيقة أنه ، على طول المسار المحدد بواسطة 
GOPATH ، لدينا بنية المجلد التالية:
 └── $GOPATH    └── src        └── github.com            └── gopherguides 
سنقوم بتسمية الحزمة التي سنقوم بتطويرها في هذا الدليل ، 
greet . للقيام بذلك ، قم بإنشاء دليل 
gopherguides دليل 
gopherguides . نتيجة لذلك ، سوف تتخذ بنية المجلد الموجودة النموذج التالي:
 └── $GOPATH    └── src        └── github.com            └── gopherguides                └── greet 
نحن الآن على استعداد لإضافة الملف الأول إلى دليل 
greet . عادةً ما يسمى الملف الذي يمثل نقطة إدخال الحزمة بنفس دليل الحزمة. في هذه الحالة ، يعني هذا أننا في دليل 
greet.go ، 
greet.go ملف 
greet.go :
 └── $GOPATH    └── src        └── github.com            └── gopherguides                └── greet                    └── greet.go 
في هذا الملف ، يمكننا كتابة الكود الذي نريد إعادة استخدامه في مشاريعنا. في هذه الحالة ، سنقوم بإنشاء وظيفة 
Hello ، والتي تعرض النص 
Hello, World! .
افتح ملف 
greet.go في محرر نصوص وأضف الكود التالي إليه:
 package greet import "fmt" func Hello() {    fmt.Println("Hello, World!") } 
دعنا نحلل محتويات هذا الملف. يجب أن يحتوي السطر الأول من كل ملف على اسم الحزمة التي نعمل بها. نظرًا لأننا في 
package greet ، يتم استخدام الكلمة الأساسية 
package هنا ، متبوعة باسم الحزمة:
 package greet 
هذا يخبر المترجم بقبول كل شيء في الملف كجزء من حزمة 
greet .
بعد ذلك ، يتم استيراد الحزم اللازمة باستخدام عبارة 
import . في هذه الحالة ، نحتاج إلى حزمة واحدة فقط - 
fmt :
 import "fmt" 
وأخيراً ، نقوم بإنشاء وظيفة 
Hello . ستستخدم إمكانات حزمة 
fmt لعرض السلسلة 
Hello, World! :
 func Hello() {    fmt.Println("Hello, World!") } 
الآن ، بعد إنشاء حزمة 
greet ، يمكنك استخدامها في أي حزمة أخرى. لنقم بإنشاء حزمة جديدة نستخدم فيها حزمة 
greet .
وهي ، سنقوم بإنشاء حزمة 
example . للقيام بذلك ، سوف ننطلق من نفس الافتراضات التي بدأنا منها ، 
greet حزمة 
greet . أولاً ، قم بإنشاء مجلد 
example في مجلد 
gopherguides :
 └── $GOPATH    └── src        └── github.com            └── gopherguides                    └── example 
الآن قم بإنشاء ملف يمثل نقطة إدخال الحزمة. نعتبر هذه الحزمة كبرنامج قابل للتنفيذ ، وليس كحزمة تم التخطيط لاستخدام الكود الخاص بها في حزم أخرى. عادة ما تسمى الملفات التي تمثل نقاط إدخال البرامج 
main.go :
 └── $GOPATH    └── src        └── github.com            └── gopherguides                └── example                    └── main.go 
افتح الملف 
main.go في المحرر 
main.go التعليمة البرمجية التالية فيه ، والذي يسمح لك باستخدام إمكانات حزمة 
greet :
 package main import "github.com/gopherguides/greet" func main() {    greet.Hello() } 
لقد قمنا باستيراد حزمة 
main.go ملف 
main.go ، مما يعني أنه لاستدعاء الوظيفة المعلنة في هذه الحزمة ، نحتاج إلى استخدام نقطة الترقيم. تدوين النقطة هو بنية يتم فيها وضع نقطة بين اسم الحزمة واسم المورد الخاص بهذه الحزمة التي سيتم استخدامها. على سبيل المثال ، في حزمة 
greet ، تلعب وظيفة 
Hello دور المورد. إذا كنت بحاجة إلى استدعاء هذه الوظيفة ، 
: greet.Hello() استخدام تدوين النقاط 
: greet.Hello() .
الآن يمكنك فتح المحطة وتشغيل البرنامج:
 go run main.go 
بعد القيام بذلك ، سيعرض الجهاز ما يلي:
 Hello, World! 
الآن دعنا نتحدث عن كيفية استخدام المتغيرات المعلنة في الحزم. للقيام بذلك ، أضف تعريف المتغير إلى ملف 
greet.go :
 package greet import "fmt" var Shark = "Sammy" func Hello() {    fmt.Println("Hello, World!") } 
افتح الملف 
main.go وأضف سطرًا إليه حيث يتم استخدام وظيفة 
fmt.Println() لعرض قيمة متغير 
Shark المُعلن عنها في حزمة 
greet.go . وهي إحضار 
main.go إلى النموذج التالي:
 package main import (    "fmt"    "github.com/gopherguides/greet" ) func main() {    greet.Hello()    fmt.Println(greet.Shark) } 
قم بتشغيل البرنامج مرة أخرى:
 go run main.go 
الآن سوف تقوم بإخراج ما يلي:
 Hello, World! Sammy 
الآن دعونا نتحدث عن كيفية الإعلان عن أنواع في الحزم. إنشاء نوع 
Octopus مع حقول 
Name Color ، وإنشاء طريقة الكتابة. عند استدعاء هذه الطريقة ، ستُرجع المحتويات التي تمت معالجتها بشكل خاص لحقول 
Octopus . دعنا 
greet.go إلى النموذج التالي:
 package greet import "fmt" var Shark = "Sammy" type Octopus struct {    Name string    Color string } func (o Octopus) String() string {    return fmt.Sprintf("The octopus's name is %q and is the color %s.", o.Name, o.Color) } func Hello() {    fmt.Println("Hello, World!") } 
الآن افتح 
main.go ، قم بإنشاء مثيل لهيكل النوع الجديد فيه والرجوع إلى طريقة 
String() :
 package main import (    "fmt"    "github.com/gopherguides/greet" ) func main() {    greet.Hello()    fmt.Println(greet.Shark)    oct := greet.Octopus{        Name: "Jesse",        Color: "orange",    }    fmt.Println(oct.String()) } 
بعد إنشاء مثيل 
Octopus باستخدام بنية تبدو مثل 
oct := greet.Octopus ، يمكنك الوصول إلى أساليب وخصائص النوع من 
main.go الملف 
main.go يتيح لك هذا ، على وجه الخصوص ، استخدام الأمر 
oct.String() الموجود في نهاية ملف 
main.go دون اللجوء إلى 
main.go . بالإضافة إلى ذلك ، يمكننا ، على سبيل المثال ، الرجوع إلى حقل بنية 
Color باستخدام بنية 
Color . في الوقت نفسه ، كما لو كنا نسميها الطريقة ، لا نصل إلى 
greet .
تستخدم طريقة 
String من نوع 
Octopus وظيفة 
fmt.Sprintf لتشكيل الجملة وتُرجع ، باستخدام 
return ، والنتيجة ، السلسلة ، إلى استدعاء الأسلوب (في هذه الحالة ، يكون هذا المكان في 
main.go ).
قم بتشغيل البرنامج مرة أخرى:
 go run main.go 
سيتم إخراج ما يلي إلى وحدة التحكم:
 Hello, World! Sammy The octopus's name is "Jesse" and is the color orange. 
الآن وقد قمنا بتجهيز Octopus بطريقة 
String ، لدينا آلية إخراج معلومات نوع مناسبة لإعادة الاستخدام. إذا كنت بحاجة في المستقبل إلى تغيير سلوك هذه الطريقة ، والتي يمكن استخدامها في العديد من المشاريع ، فسيكون ذلك كافيًا لتعديل الكود في 
greet.go .
كيان التصدير
ربما لاحظت أن كل شيء عملنا معه أثناء الوصول إلى حزمة 
greet له أسماء تبدأ بحرف كبير. Go ليس لديها معدّلات وصول مثل 
public أو 
private أو 
protected ، والتي هي في لغات أخرى. يتم التحكم في رؤية الكيانات الخاصة بالآليات الخارجية من خلال حقيقة أن تبدأ أسمائهم بالحرف الصغير أو الكبير. نتيجة لذلك ، تتوفر الأنواع والمتغيرات والوظائف التي تبدأ أسماؤها بحرف كبير خارج الحزمة الحالية. يسمى الرمز المرئي خارج الحزمة تصدير.
إذا قمت بتجهيز نوع 
Octopus بأسلوب جديد يسمى 
reset main.go ، فيمكن استدعاء هذه الطريقة من حزمة 
main.go ، ولكن ليس من ملف 
main.go ، الموجود خارج حزمة 
main.go . هنا نسخة محدثة من 
greet.go :
 package greet import "fmt" var Shark = "Sammy" type Octopus struct {    Name string    Color string } func (o Octopus) String() string {    return fmt.Sprintf("The octopus's name is %q and is the color %s.", o.Name, o.Color) } func (o Octopus) reset() {    o.Name = ""    o.Color = "" } func Hello() {    fmt.Println("Hello, World!") } 
دعنا نحاول 
reset الاتصال من ملف 
main.go :
 package main import (    "fmt"    "github.com/gopherguides/greet" ) func main() {    greet.Hello()    fmt.Println(greet.Shark)    oct := greet.Octopus{        Name: "Jesse",        Color: "orange",    }    fmt.Println(oct.String())    oct.reset() } 
سينتج عن هذا خطأ التحويل البرمجي التالي:
 oct.reset undefined (cannot refer to unexported field or method greet.Octopus.reset) 
لتصدير طريقة 
reset نوع 
Octopus ، تحتاج إلى إعادة تسميته ، مع استبدال الحرف الأول ، بالحرف الصغير ، برأس مال 
R نحن نفعل هذا من خلال تحرير 
greet.go :
 package greet import "fmt" var Shark = "Sammy" type Octopus struct {    Name string    Color string } func (o Octopus) String() string {    return fmt.Sprintf("The octopus's name is %q and is the color %s.", o.Name, o.Color) } func (o Octopus) Reset() {    o.Name = ""    o.Color = "" } func Hello() {    fmt.Println("Hello, World!") } 
سيؤدي ذلك إلى حقيقة أننا سنكون قادرين على استدعاء 
Reset من الحزم الأخرى ودون مواجهة رسائل خطأ:
 package main import (    "fmt"    "github.com/gopherguides/greet" ) func main() {    greet.Hello()    fmt.Println(greet.Shark)    oct := greet.Octopus{        Name: "Jesse",        Color: "orange",    }    fmt.Println(oct.String())    oct.Reset()    fmt.Println(oct.String()) } 
قم بتشغيل البرنامج:
 go run main.go 
إليك ما يصل إلى وحدة التحكم:
 Hello, World! Sammy The octopus's name is "Jesse" and is the color orange The octopus's name is "" and is the color . 
عن طريق استدعاء طريقة 
Reset ، قمنا بمسح حقول 
Name Color لمثيل 
Octopus بنا. نتيجة لذلك ، عند استدعاء 
String ، حيث تم عرض محتويات حقول 
Name Color مسبقًا ، لا يتم عرض أي شيء الآن.
النتائج
لا تختلف حزم Go Go عن كتابة رمز Go المعتاد. ومع ذلك ، فإن وضع رمز الحزمة في الدلائل الخاصة به يسمح بعزل الرمز ، والذي يمكن استخدامه في أي مشاريع Go أخرى. تحدثنا هنا عن كيفية الإعلان عن الوظائف والمتغيرات والأنواع في الحزم ، وفحصنا كيفية استخدام هذه الكيانات خارج الحزم ، وتوصلنا إلى مكان تخزين الحزم المصممة للاستخدام المتكرر.
أعزائي القراء! ما هي البرامج التي عادة ما تكتبها على Go؟ هل تستخدم حزم الملكية فيها؟
