किसी फ़ील्ड के लिए टैग आपको मेटा-जानकारी को उस फ़ील्ड से जोड़ने की अनुमति देता है जिसे प्रतिबिंब का उपयोग करके प्राप्त किया जा सकता है। आमतौर पर इसका उपयोग ट्रांसफ़ॉर्मेशन जानकारी प्रदान करने के लिए किया जाता है कि कैसे एक संरचनात्मक क्षेत्र को किसी अन्य प्रारूप से (या डेटाबेस से संग्रहीत / पुनर्प्राप्त) से इनकोड किया गया है, लेकिन आप इसका उपयोग उस मेटा-जानकारी को संग्रहीत करने के लिए कर सकते हैं, जिसे आप दूसरे के लिए चाहते हैं। पैकेज या अपने स्वयं के उपयोग के लिए।
के रूप में प्रलेखन में उल्लेख किया गया है reflect.StructTag, सम्मेलन द्वारा एक टैग स्ट्रिंग का मूल्य एक अंतरिक्ष-पृथक key:"value"जोड़े की सूची है , उदाहरण के लिए:
type User struct {
Name string `json:"name" xml:"name"`
}
keyआम तौर पर पैकेज है कि बाद में इंगित करती है "value", के लिए है के लिए उदाहरण jsonकुंजी कार्रवाई की जाती है / द्वारा इस्तेमाल किया encoding/jsonपैकेज।
यदि कई सूचनाओं को पारित किया जाना है "value", तो आमतौर पर इसे अल्पविराम ( ',') के साथ अलग करके निर्दिष्ट किया जाता है , उदाहरण के लिए
Name string `json:"name,omitempty" xml:"name"`
आमतौर पर एक डैश मान ( '-') "value"इस प्रक्रिया से क्षेत्र को बाहर करने के साधन के लिए (उदाहरण के मामले में jsonइसका मतलब यह नहीं है कि उस क्षेत्र को मार्शल या अनमर्शल नहीं किया गया है)।
प्रतिबिंब का उपयोग करके अपने कस्टम टैग तक पहुंचने का उदाहरण
हम reflectसंरचनात्मक क्षेत्रों के टैग मूल्यों तक पहुंचने के लिए प्रतिबिंब ( पैकेज) का उपयोग कर सकते हैं। मूल रूप से हमें Typeअपनी संरचना का अधिग्रहण करने की आवश्यकता है , और फिर हम उदाहरण के लिए Type.Field(i int)या जैसे फ़ील्ड को क्वेरी कर सकते हैं Type.FieldByName(name string)। ये विधियाँ एक मान StructFieldलौटाती हैं, जो एक संरचनात्मक क्षेत्र का वर्णन / प्रतिनिधित्व करता है; और StructField.Tagएक प्रकार का मूल्य है StructTagजो एक टैग मूल्य का वर्णन / प्रतिनिधित्व करता है।
पहले हमने "सम्मेलन" के बारे में बात की थी । इस सम्मेलन का अर्थ है कि यदि आप इसका पालन करते हैं, तो आप उस StructTag.Get(key string)विधि का उपयोग कर सकते हैं जो एक टैग के मूल्य को पार्स करता है और आपको निर्दिष्ट "value"में से keyआपको वापस लौटाता है । सम्मेलन कार्यान्वित / इस में बनाया गया है Get()विधि। यदि आप कन्वेंशन का पालन नहीं करते हैं, तो जोड़े Get()को पार्स नहीं कर पाएंगे key:"value"और आप जो खोज रहे हैं उसे पा सकते हैं। यह भी एक समस्या नहीं है, लेकिन फिर आपको अपने स्वयं के पार्सिंग तर्क को लागू करने की आवश्यकता है।
इसके अलावा वहाँ StructTag.Lookup()(गो 1.7 में जोड़ा गया था) जो "की तरह है, Get()लेकिन टैग को दिए गए टैग से दिए गए कुंजी से अलग नहीं करता है, जो दिए गए कुंजी के साथ एक खाली स्ट्रिंग को जोड़ रहा है" ।
तो आइए एक सरल उदाहरण देखें:
type User struct {
Name string `mytag:"MyName"`
Email string `mytag:"MyEmail"`
}
u := User{"Bob", "bob@mycompany.com"}
t := reflect.TypeOf(u)
for _, fieldName := range []string{"Name", "Email"} {
field, found := t.FieldByName(fieldName)
if !found {
continue
}
fmt.Printf("\nField: User.%s\n", fieldName)
fmt.Printf("\tWhole tag value : %q\n", field.Tag)
fmt.Printf("\tValue of 'mytag': %q\n", field.Tag.Get("mytag"))
}
आउटपुट (इसे खेल के मैदान पर आज़माएं ):
Field: User.Name
Whole tag value : "mytag:\"MyName\""
Value of 'mytag': "MyName"
Field: User.Email
Whole tag value : "mytag:\"MyEmail\""
Value of 'mytag': "MyEmail"
गोफरकेन 2015 में संरचित टैग के बारे में एक प्रस्तुति थी जिसे कहा जाता है:
संरचना टैग (स्लाइड) के कई चेहरे (और एक वीडियो )
यहां आमतौर पर उपयोग की जाने वाली टैग कुंजी की एक सूची दी गई है:
json - encoding/jsonपैकेज द्वारा उपयोग किया जाता है , पर विस्तृतjson.Marshal()
xml - encoding/xmlपैकेज द्वारा उपयोग किया जाता है , पर विस्तृतxml.Marshal()
bson - गोब्सन द्वारा उपयोग किया जाता है , पर विस्तृतbson.Marshal()
protobuf - द्वारा प्रयोग किया जाता है github.com/golang/protobuf/proto, पैकेज डॉक्टर में विस्तृत
yaml - gopkg.in/yaml.v2पैकेज द्वारा उपयोग किया जाता है , पर विस्तृतyaml.Marshal()
db - github.com/jmoiron/sqlxपैकेज द्वारा उपयोग किया जाता है ; github.com/go-gorp/gorpपैकेज द्वारा भी उपयोग किया जाता है
orm - github.com/astaxie/beego/ormपैकेज द्वारा उपयोग किया जाता है , मॉडल में विस्तृत - बीगो ओआरएम
gorm - github.com/jinzhu/gormपैकेज द्वारा उपयोग किया जाता है , उदाहरण उनके डॉक्टर में पाए जा सकते हैं: मॉडल
valid - github.com/asaskevich/govalidatorपैकेज द्वारा उपयोग किया जाता है , उदाहरण परियोजना पृष्ठ में पाए जा सकते हैं
datastore- appengine/datastore(Google ऐप इंजन प्लेटफ़ॉर्म, डेटास्टोर सेवा) द्वारा उपयोग किया जाता है , जो गुणों पर विस्तृत हैं
schema - पैकेज प्रपत्र में विस्तृत HTML फॉर्म वैल्यू के साथ github.com/gorilla/schemaभरने के लिए उपयोग किया जाता हैstruct
asn - encoding/asn1पैकेज द्वारा उपयोग किया जाता है , विस्तृत asn1.Marshal()औरasn1.Unmarshal()
csv - github.com/gocarina/gocsvपैकेज द्वारा उपयोग किया जाता है