2014-05-07 27 views
15

Bir yapının alanına yansıtmak ve etiket değerlerine bir başvuru almak mümkün mü? ÖrneğinGolang Yansıma: Yapısal alandan etiket alın

: Görebildiğim kadarıyla

type User struct { 
    name string `json:name-field` 
    age  int 
} 
... 
user := &User{"John Doe The Fourth", 20} 
getStructTag(user.name) 
... 
func getStructTag(i interface{}) string{ 
    //get tag from field 

} 

Bunu yapmak için her zamanki gibi typ.NumField() yoluyla aralığı ve sonra field.Tag.Get ("etiketadı") aramak. Ancak, kullanım durumumda, tüm yapıyı geçmek zorunda kalmamak çok daha iyi olurdu. Herhangi bir fikir var mı?

+0

Ayrıca alanları alana göre de alabilirsiniz. Yapıyı geçmenin nesi yanlış? Yapıyı geçmezseniz, türü nasıl elde edersiniz? – JimB

cevap

32

Tüm yapıya geçmek zorunda değilsiniz, ancak alanlardan birinin değerini geçmek yeterli değildir. Örneğinizdeki user.name sadece bir string'dur - yansıtılan paketin orijinal yapıya geri dönüşü yoktur.

Bunun yerine, belirli bir alanda için reflect.StructField etrafında geçmesi gerekiyor:

field, ok := reflect.TypeOf(user).Elem().FieldByName("name") 
… 
tag = string(field.Tag) 

http://play.golang.org/p/G6wxUVVbOw

Bkz (user bir yapı için bir işaretçi olduğu için not, yukarıdaki Elem kullanın).