खोज…
पैकेज initalization
पैकेज में init
विधियाँ हो सकती हैं जो मुख्य से पहले केवल एक बार चलाई जाती हैं।
package usefull
func init() {
// init code
}
यदि आप केवल पैकेज इनिशियलाइज़ेशन को चलाना चाहते हैं, तो उसमें से कुछ भी आयात किए बिना निम्नलिखित आयात अभिव्यक्ति का उपयोग करें।
import _ "usefull"
पैकेज निर्भरता का प्रबंधन
गो निर्भरता डाउनलोड करने का एक सामान्य तरीका है गो $GOPATH/src
go get <package>
कमांड का उपयोग करके, जो पैकेज को वैश्विक / साझा किए गए $GOPATH/src
निर्देशिका में $GOPATH/src
। इसका मतलब यह है कि प्रत्येक पैकेज के एक एकल संस्करण को प्रत्येक परियोजना में जोड़ा जाएगा जो इसे एक निर्भरता के रूप में शामिल करता है। इसका मतलब यह भी है कि जब कोई नया डेवलपर आपकी परियोजना को लागू करता है, तो वे प्रत्येक निर्भरता का नवीनतम संस्करण go get
करेंगे।
हालाँकि, आप vendor/
निर्देशिका में किसी प्रोजेक्ट की सभी निर्भरताएँ जोड़कर बिल्ड वातावरण को सुसंगत रख सकते हैं। अपने प्रोजेक्ट की रिपॉजिटरी के साथ-साथ प्रतिशोधी निर्भरता को बनाए रखना आपको प्रति-प्रोजेक्ट निर्भरता वर्जनिंग करने की अनुमति देता है, और आपके निर्माण के लिए एक सुसंगत वातावरण प्रदान करता है।
यह आपकी परियोजना की संरचना जैसा दिखेगा:
$GOPATH/src/
├── github.com/username/project/
| ├── main.go
| ├── vendor/
| | ├── github.com/pkg/errors
| | ├── github.com/gorilla/mux
विभिन्न पैकेज और फ़ोल्डर नाम का उपयोग करना
यह फ़ोल्डर नाम के अलावा अन्य पैकेज नाम का उपयोग करने के लिए पूरी तरह से ठीक है। यदि हम ऐसा करते हैं, तो हमें अभी भी निर्देशिका संरचना के आधार पर पैकेज को आयात करना होगा, लेकिन आयात के बाद हमें इसे पैकेज क्लॉज में उपयोग किए गए नाम से संदर्भित करना होगा।
उदाहरण के लिए, आप एक फ़ोल्डर है, तो $GOPATH/src/mypck
, और उस में हम एक फ़ाइल है a.go
:
package apple
const Pi = 3.14
इस पैकेज का उपयोग करना:
package main
import (
"mypck"
"fmt"
)
func main() {
fmt.Println(apple.Pi)
}
भले ही यह काम करता है, आपके पास फ़ोल्डर नाम से पैकेज नाम को विचलन करने का एक अच्छा कारण होना चाहिए (या यह गलतफहमी और भ्रम का स्रोत बन सकता है)।
इसका क्या उपयोग है?
सरल। पैकेज का एक नाम एक निष्क्रिय खाता है :
identifier = letter { letter | unicode_digit } .
जो यूनिकोड अक्षरों को पहचानकर्ताओं में उपयोग करने की अनुमति देता है, जैसे αβ
a गो में एक मान्य पहचानकर्ता है। फ़ोल्डर और फ़ाइल नाम गो द्वारा नहीं बल्कि ऑपरेटिंग सिस्टम द्वारा नियंत्रित किए जाते हैं, और विभिन्न फ़ाइल सिस्टम में अलग-अलग प्रतिबंध होते हैं। वास्तव में कई फाइल सिस्टम हैं जो सभी वैध गो पहचानकर्ताओं को फ़ोल्डर के नाम के रूप में अनुमति नहीं देंगे, इसलिए आप अपने पैकेजों को नाम नहीं दे पाएंगे अन्यथा भाषा की कल्पना की अनुमति होगी।
अपने युक्त फ़ोल्डर की तुलना में विभिन्न पैकेज नामों का उपयोग करने का विकल्प होने के कारण, आपके पास वास्तव में अपने पैकेजों को नाम देने का विकल्प होता है जो भाषा की अनुमति देता है, चाहे अंतर्निहित ऑपरेटिंग और फ़ाइल सिस्टम।
आयात करने वाले पैकेज
आप कथन के साथ एकल पैकेज आयात कर सकते हैं:
import "path/to/package"
या समूह एक साथ कई आयात:
import (
"path/to/package1"
"path/to/package2"
)
यह .go
फ़ाइलों के लिए $GOPATH
अंदर इसी import
पथ में दिखेगा और आपको packagename.AnyExportedName
माध्यम से निर्यात किए गए नामों तक पहुंचने देता है।
आप ./
साथ पैकेजों को वर्तमान फ़ोल्डर के अंदर स्थानीय संकुल तक भी पहुँचा सकते हैं। इस तरह की संरचना वाली परियोजना में:
project
├── src
│ ├── package1
│ │ └── file1.go
│ └── package2
│ └── file2.go
└── main.go
आप इसे file1.go
और file2.go
में कोड आयात करने के लिए main.go
में कॉल कर सकते हैं:
import (
"./src/package1"
"./src/package2"
)
चूंकि पैकेज-नाम अलग-अलग पुस्तकालयों में टकरा सकते हैं, इसलिए आप एक पैकेज को एक नए नाम पर देना चाहते हैं। आप अपने आयात-कथन को उस नाम के साथ उपसर्ग करके कर सकते हैं, जिस नाम का आप उपयोग करना चाहते हैं।
import (
"fmt" //fmt from the standardlibrary
tfmt "some/thirdparty/fmt" //fmt from some other library
)
यह आपको fmt
का उपयोग करके पूर्व fmt
पैकेज तक पहुँचने की अनुमति देता है fmt.*
और tfmt.*
का उपयोग करके बाद वाले fmt
पैकेज को tfmt.*
आप पैकेज को स्वयं के नामस्थान में भी आयात कर सकते हैं, ताकि आप package.
बिना निर्यात किए गए नामों का उल्लेख कर सकें package.
उपसर्ग के रूप में एकल बिंदु का उपयोग करके उपसर्ग:
import (
. "fmt"
)
उपरोक्त उदाहरण वैश्विक नाम स्थान में fmt
आयात करता है और आपको कॉल करता है, उदाहरण के लिए, सीधे Printf
: प्लेग्राउंड
यदि आप एक पैकेज आयात करते हैं, लेकिन इसके निर्यात किए गए नामों में से किसी का भी उपयोग नहीं करते हैं, तो गो संकलक एक त्रुटि-संदेश प्रिंट करेगा। इसे दरकिनार करने के लिए, आप उर्फ को अंडरस्कोर पर सेट कर सकते हैं:
import (
_ "fmt"
)
यह उपयोगी हो सकता है यदि आप इस पैकेज को सीधे एक्सेस नहीं करते हैं, लेकिन इसे चलाने के लिए init
फ़ंक्शन की आवश्यकता है।
ध्यान दें:
जैसा कि पैकेज के नाम फ़ोल्डर संरचना पर आधारित हैं, फ़ोल्डर के नाम और आयात संदर्भ (केस संवेदनशीलता सहित) में कोई भी परिवर्तन लिनक्स और ओएस-एक्स में एक "संकलन-असंवेदनशील आयात टकराव" एक संकलन समय त्रुटि का कारण होगा, जिसे ट्रेस करना मुश्किल है और ठीक करें (त्रुटि संदेश केवल मनुष्यों के लिए थोथा गूढ़ है क्योंकि यह विपरीत को व्यक्त करने की कोशिश करता है - कि, मामले की संवेदनशीलता के कारण तुलना विफल रही)।
उदा: "पाथ / टू / पैकेज 1" बनाम "पाथ / टू / पैकेज 1"
लाइव उदाहरण: https://github.com/akamai-open/AkamaiOPEN-edgegrid-golang/issen/2