Используя reflect, как вы устанавливаете значение поля структуры?


имея грубое время работы с полями структуры с помощью reflect пакета. в частности, не выяснили, как установить значение поля.

type t struct { fi int; fs string }
var r t = t{ 123, "jblow" }
var i64 int64 = 456
  1. получение имени Поля i-это, кажется, работает

    var field = reflect.TypeOf(r).Field(i).Name

  2. получение значения поля i как A) интерфейс{}, b) int - это, кажется, работает

    var iface interface{} = reflect.ValueOf(r).Field(i).Interface()

    var i int = int(reflect.ValueOf(r).Field(i).Int())

  3. установка значения поля i-try один-паника

    reflect.ValueOf(r).Field(i).SetInt( i64 )

    паника: отражать.Значение·SetInt используя значение, полученное с помощью неэкспортируется поле

    предполагая, что ему не нравятся имена полей "id" и "name", поэтому переименован в "Id"и " Name"

    а) верно ли это предположение?

    b) если правильно, то мысль не нужна, так как в том же файле / пакете

  4. установка значения поля 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 71

2 ответа:

Go доступен как open source code. Хороший способ узнать об отражении-посмотреть, как разработчики core Go используют его. Например, Go fmt и json пакеты. Документация пакета содержит ссылки на файлы исходного кода под заголовком файлы пакета.

перейти в JSON пакет маршалов и неупорядочивает JSON от А идти структур.


вот пошаговый пример, который устанавливает значение а struct поле, тщательно избегая ошибок.

The Go reflect пакета CanAddr

Это, кажется, работает:

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