tendo dificuldade em trabalhar com campos de estrutura usando reflect
pacote. em particular, não descobri como definir o valor do campo.
tipo t struct {fi int; string fs} var rt = t {123, "jblow"} var i64 int64 = 456
obter o nome do campo i - parece funcionar
var field = reflect.TypeOf(r).Field(i).Name
obter o valor do campo i como a) interface {}, b) int - parece funcionar
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
var i int = int(reflect.ValueOf(r).Field(i).Int())
definindo valor do campo i - tente um - pânico
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic : reflect.Value · SetInt usando o valor obtido usando o campo não exportado
presumindo que não gostasse dos nomes de campo "id" e "nome", então renomeado para "Id" e "Nome"
a) esta suposição está correta?
b) se correto, achei desnecessário já que no mesmo arquivo / pacote
definir o valor do campo i - tente dois (com os nomes dos campos em maiúsculas) - pânico
reflect.ValueOf(r).Field(i).SetInt( 465 )
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic : reflect.Value · SetInt usando valor não endereçável
As instruções abaixo por @peterSO são completas e de alta qualidade
Quatro. isso funciona:
reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )
Ele documenta também que os nomes dos campos devem ser exportáveis (começar com letra maiúscula)
fonte
reflect
para definir dados foi comments.gmane.org/gmane.comp.lang.go.general/35045 , mas mesmo lá ele costumavajson.Unmarshal
fazer o trabalho sujoRespostas:
Go está disponível como código-fonte aberto . Uma boa maneira de aprender sobre reflexão é ver como os principais desenvolvedores de Go a usam. Por exemplo, os pacotes Go fmt e json . A documentação do pacote possui links para os arquivos de código-fonte sob o título Arquivos de pacote.
O pacote Go json empacota e descompacta estruturas JSON de e para Go.
Aqui está um exemplo passo a passo que define o valor de um
struct
campo enquanto evita erros cuidadosamente.O
reflect
pacote Go tem umaCanAddr
função.O
reflect
pacote Go tem umaCanSet
função que, setrue
, implica queCanAddr
também étrue
.Precisamos ter certeza de que nós podemos
Set
ostruct
campo. Por exemplo,Se pudermos ter certeza de que todas as verificações de erro são desnecessárias, o exemplo simplifica para,
fonte
Isso parece funcionar:
Impressões:
fonte