Используя reflect, как вы устанавливаете значение поля структуры?
имея грубое время работы с полями структуры с помощью reflect
пакета. в частности, не выяснили, как установить значение поля.
type t struct { fi int; fs string } var r t = t{ 123, "jblow" } var i64 int64 = 456
-
получение имени Поля i-это, кажется, работает
var field = reflect.TypeOf(r).Field(i).Name
-
получение значения поля i как A) интерфейс{}, b) int - это, кажется, работает
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
var i int = int(reflect.ValueOf(r).Field(i).Int())
-
установка значения поля i-try один-паника
reflect.ValueOf(r).Field(i).SetInt( i64 )
паника: отражать.Значение·SetInt используя значение, полученное с помощью неэкспортируется поле
предполагая, что ему не нравятся имена полей "id" и "name", поэтому переименован в "Id"и " Name"
а) верно ли это предположение?
b) если правильно, то мысль не нужна, так как в том же файле / пакете
-
установка значения поля i-попробуйте два (с заглавными именами полей ) - паника
reflect.ValueOf(r).Field(i).SetInt( 465 )
reflect.ValueOf(r).Field(i).SetInt( i64 )
паника: отражать.Значение·SetInt используя значение обратиться
инструкции ниже @peterSO являются тщательными и высокое качество
четыре. это работает:
reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )
он также документирует, что имена полей должны быть экспортируемыми (начинаются с заглавной буквы)
2 ответа:
Go доступен как open source code. Хороший способ узнать об отражении-посмотреть, как разработчики core Go используют его. Например, Go fmt и json пакеты. Документация пакета содержит ссылки на файлы исходного кода под заголовком файлы пакета.
перейти в JSON пакет маршалов и неупорядочивает JSON от А идти структур.
вот пошаговый пример, который устанавливает значение а
struct
поле, тщательно избегая ошибок.
Это, кажется, работает:
package main import ( "fmt" "reflect" ) type Foo struct { Number int Text string } func main() { foo := Foo{123, "Hello"} fmt.Println(int(reflect.ValueOf(foo).Field(0).Int())) reflect.ValueOf(&foo).Elem().Field(0).SetInt(321) fmt.Println(int(reflect.ValueOf(foo).Field(0).Int())) }
принты:
123 321