трудно работать с полями структуры с помощью reflect
package. в частности, не придумали, как задать значение поля.
введите t struct {fi int; строка fs} var rt = t {123, "jblow"} var i64 int64 = 456
получение имени поля i - похоже, это работает
var field = reflect.TypeOf(r).Field(i).Name
получение значения поля i как a) interface {}, b) int - похоже, это работает
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
var i int = int(reflect.ValueOf(r).Field(i).Int())
установка значения поля i - попробуйте один - паника
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic : reflection.Value · SetInt с использованием значения, полученного с использованием неэкспортированного поля
предполагая, что ему не нравятся имена полей «id» и «name», поэтому он переименован в «Id» и «Name»
а) верно ли это предположение?
б) если верно, то считал ненужным, поскольку в том же файле / пакете
установка значения поля i - попробуйте два (с заглавными именами полей) - паника
reflect.ValueOf(r).Field(i).SetInt( 465 )
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic : reflection.Value · SetInt с использованием неадресуемого значения
Инструкции, приведенные ниже от @peterSO, являются подробными и качественными
Четыре. это работает:
reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )
он также подтверждает, что имена полей должны быть экспортируемыми (начинаются с заглавной буквы)
источник
reflect
для установки данных, был comments.gmane.org/gmane.comp.lang.go.general/35045 , но даже там онjson.Unmarshal
выполнял настоящую грязную работуОтветы:
Go доступен как открытый исходный код . Хороший способ узнать об отражении - посмотреть, как его используют разработчики ядра Go. Например, пакеты Go fmt и json . В документации пакета есть ссылки на файлы исходного кода под заголовком Файлы пакета.
Пакет Go json маршалирует и демаршалирует JSON из и в структуры Go.
Вот пошаговый пример, который устанавливает значение
struct
поля, тщательно избегая ошибок.В
reflect
пакете Go естьCanAddr
функция.В
reflect
пакете Go естьCanSet
функция, котораяtrue
подразумевает, чтоCanAddr
она тоже естьtrue
.Нам нужно убедиться, что мы можем
Set
этоstruct
поле. Например,Если мы можем быть уверены, что все проверки ошибок не нужны, пример упрощается до:
источник
Кажется, это работает:
Печать:
источник