Bir alanın etiketi, alana yansıma kullanılarak elde edilebilecek meta bilgileri eklemenizi sağlar. Genellikle, bir yapı alanının başka bir formata nasıl kodlandığı veya kodunun nasıl çözüldüğü (veya bir veritabanından saklandığı / alındığı) hakkında dönüşüm bilgisi sağlamak için kullanılır, ancak başka bir amaç için istediğiniz meta bilgileri depolamak için kullanabilirsiniz. paket veya kendi kullanımınız için.
Belgelerinde belirtildiği gibi, reflect.StructTag
kural olarak, bir etiket dizesinin değeri, boşlukla ayrılmış bir key:"value"
çiftler listesidir, örneğin:
type User struct {
Name string `json:"name" xml:"name"`
}
key
Genellikle daha sonra bu paketi göstermektedir "value"
Örneğin, için json
anahtarlar işleme / tarafından kullanılan encoding/json
bir paket.
İçine birden fazla bilgi iletilecekse "value"
, genellikle virgülle ( ','
), ör.
Name string `json:"name,omitempty" xml:"name"`
Genellikle , alanı işlemden hariç tutma araçları için bir tire değeri ( '-'
) "value"
(örneğin, json
bu alanı mareşal veya mareşal olmayan anlamında).
Yansıma kullanarak özel etiketlerinize erişme örneği
reflect
Yapı alanlarının etiket değerlerine erişmek için yansıma ( paket) kullanabiliriz. Temel olarak yapımızdan bir şey edinmeliyiz Type
ve daha sonra alanları Type.Field(i int)
veya ile sorgulayabiliriz Type.FieldByName(name string)
. Bu yöntemler StructField
, bir yapı alanını tanımlayan / temsil eden bir değer döndürür ; ve bir etiket değerini tanımlayan / temsil eden bir StructField.Tag
tür StructTag
değeridir.
Daha önce "kongre" hakkında konuşmuştuk . Bunu takip ederseniz, kullanabileceğini Bu kongre araçlarının StructTag.Get(key string)
bir etiket değerini ayrıştırır ve döndüren yöntemi "value"
ait key
Belirttiğiniz. Kongre bu yerleşik / uygulanmaktadır Get()
yöntemle. Sözleşmeyi takip etmezseniz, çiftleri Get()
ayrıştıramaz key:"value"
ve aradığınızı bulamazsınız. Bu da bir sorun değil, ama sonra kendi ayrıştırma mantığını uygulamanız gerekiyor.
Ayrıca StructTag.Lookup()
(Go 1.7'de eklenmiştir), " Get()
verilen anahtarı içermeyen etiketi boş bir dizeyi verilen anahtarla ilişkilendiren etiketten farklı ancak benzer şekilde ayırır" vardır .
Şimdi basit bir örnek görelim:
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"))
}
Çıktı ( Go Playground'da deneyin ):
Field: User.Name
Whole tag value : "mytag:\"MyName\""
Value of 'mytag': "MyName"
Field: User.Email
Whole tag value : "mytag:\"MyEmail\""
Value of 'mytag': "MyEmail"
GopherCon 2015, şu yapı etiketleri hakkında bir sunum yaptı:
Yapı Etiketlerinin Birçok Yüzü (slayt) (ve video )
Sık kullanılan etiket anahtarlarının listesi: