Basicamente, a única maneira (que eu conheço) de iterar por meio dos valores dos campos de a struct
é assim:
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
}
Eu estava me perguntando se há uma maneira melhor e mais versátil de fazer []interface{}{ r.a_number, r.a_string, }
isso, então não preciso listar cada parâmetro individualmente ou, alternativamente, há uma maneira melhor de fazer um loop em uma estrutura?
Tentei olhar o reflect
pacote, mas bati em uma parede, porque não tenho certeza do que fazer quando o recuperar reflect.ValueOf(*r).Field(0)
.
Obrigado!
go
go-reflect
oninonsense
fonte
fonte
Respostas:
Depois de recuperar o
reflect.Value
do campo usando,Field(i)
você pode obter um valor de interface dele chamandoInterface()
. O referido valor da interface representa então o valor do campo.Não há função para converter o valor do campo em um tipo concreto, pois não há, como você deve saber, genéricos em uso. Assim, não há nenhuma função com a assinatura
GetValue() T
emT
ser o tipo daquele campo (que muda de curso, dependendo do campo).O mais próximo que você pode alcançar em go é
GetValue() interface{}
e isso é exatamente o quereflect.Value.Interface()
oferece.O código a seguir ilustra como obter os valores de cada campo exportado em uma estrutura usando reflexão ( reprodução ):
fonte
reflect.Value.Type()
, sim. Mas observe que os tipos não são cidadãos de primeira classe em go, portanto, você só pode instanciar novos valores desse tipo usandoreflect
.v.Field(i).Interface()
entra em pânico se você tentar acessar campos privados não exportados. Basta ter cuidado :)v.Field(i).CanInterface()
um pode evitar o pânico em caso de campos não exportados.Se você deseja iterar os campos e valores de uma estrutura, pode usar o código Go abaixo como referência.
Corra no playground
Nota: Se os campos em sua estrutura não forem exportados, o
v.Field(i).Interface()
dará pânicopanic: reflect.Value.Interface: cannot return value obtained from unexported field or method.
fonte
Tomando a solução Chetan Kumar e caso você precise se inscrever em um
map[string]int
fonte