По сути, единственный способ (который я знаю) перебирать значения полей a struct
выглядит следующим образом:
type Example struct {
a_number uint32
a_string string
}
//...
r := &Example{(2 << 31) - 1, "...."}:
for _, d:= range []interface{}{ r.a_number, r.a_string, } {
//do something with the d
}
Мне было интересно, есть ли лучший и более универсальный способ достижения []interface{}{ r.a_number, r.a_string, }
, поэтому мне не нужно перечислять каждый параметр по отдельности или, альтернативно, есть лучший способ перебрать структуру?
Я попытался просмотреть reflect
пакет, но наткнулся на стену, потому что не знаю, что делать после того, как заберу его reflect.ValueOf(*r).Field(0)
.
Спасибо!
go
go-reflect
всезнайка
источник
источник
Ответы:
После того, как вы получили
reflect.Value
поле с помощью,Field(i)
вы можете получить из него значение интерфейса, вызвавInterface()
. Упомянутое значение интерфейса затем представляет значение поля.Нет функции для преобразования значения поля в конкретный тип, поскольку, как вы знаете, нет универсальных шаблонов. Таким образом, нет никакой функции с подписью
GetValue() T
сT
является типом этого поля (который изменяет конечно, в зависимости от области).Самое близкое, что вы можете достичь на ходу, -
GetValue() interface{}
это именно то, чтоreflect.Value.Interface()
предлагает.В следующем коде показано, как получить значения каждого экспортированного поля в структуре с помощью отражения ( воспроизведения ):
источник
reflect.Value.Type()
, да. Но обратите внимание, что типы не являются первоклассными гражданами, поэтому вы можете создавать только новые значения этого типа, используяreflect
.v.Field(i).Interface()
паникует, если вы пытаетесь получить доступ к неэкспортированным частным полям. Только будьте осторожны :)v.Field(i).CanInterface()
можно избежать паники в случае неэкспортируемых полей.Если вы хотите перебирать поля и значения структуры, вы можете использовать приведенный ниже код Go в качестве справочника.
Беги на детской площадке
Примечание: если поля в вашей структуре не экспортируются, то
v.Field(i).Interface()
возникнет паника.panic: reflect.Value.Interface: cannot return value obtained from unexported field or method.
источник
Принимая раствор Четана Кумара и в случае необходимости обратиться к
map[string]int
источник