किसी फ़ील्ड के लिए टैग आपको मेटा-जानकारी को उस फ़ील्ड से जोड़ने की अनुमति देता है जिसे प्रतिबिंब का उपयोग करके प्राप्त किया जा सकता है। आमतौर पर इसका उपयोग ट्रांसफ़ॉर्मेशन जानकारी प्रदान करने के लिए किया जाता है कि कैसे एक संरचनात्मक क्षेत्र को किसी अन्य प्रारूप से (या डेटाबेस से संग्रहीत / पुनर्प्राप्त) से इनकोड किया गया है, लेकिन आप इसका उपयोग उस मेटा-जानकारी को संग्रहीत करने के लिए कर सकते हैं, जिसे आप दूसरे के लिए चाहते हैं। पैकेज या अपने स्वयं के उपयोग के लिए।
के रूप में प्रलेखन में उल्लेख किया गया है 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
पैकेज द्वारा उपयोग किया जाता है