Как создать и установить примитив в Golang, используя отражение - PullRequest
0 голосов
/ 30 апреля 2020

Я хочу проверить, как работает моя функция setFieldValue().

func main() {

    value := uint64(0x36)
    resType := reflect.TypeOf(uint8(0))
    expectedRes := uint8(0x36)

    res := uint8(0)
    setFieldValue(reflect.ValueOf(&res).Elem(), resType.Kind(), value)

    if res == expectedRes {
        fmt.Println("voila")
    } else {
        fmt.Println("nuts")
    }
}

func setFieldValue(field reflect.Value, fieldKind reflect.Kind, fieldValue uint64) {
    switch fieldKind {
    case reflect.Uint8:
        field.SetUint(fieldValue)
    }
}

Но я не хочу, чтобы переменная res также имела тип TypeOf(uint8(0)). Если я создаю res как

        res := reflect.New(resType)
        setFieldValue(res, resType.Kind(), value)

, он не работает, потому что res не адресуется.

Как правильно создать переменную, используя отражение, а затем установить его значение в некоторой забаве c?

Или как получить экземпляр вновь созданной переменной?

1 Ответ

1 голос
/ 30 апреля 2020

reflect.New возвращает reflect.Value, который представляет указатель , сам указатель не адресуем, и он также не , что вы хотите установить значение. Однако адресуемым является значение, на которое указывает указатель, а также то, что вы хотите установить для заданного значения.

Вы можете использовать res.Elem() для разыменования указателя.

func main() {
    value := uint64(0x36)
    resType := reflect.TypeOf(uint8(0))
    expectedRes := uint8(0x36)

    res := reflect.New(resType)
    setFieldValue(res.Elem(), resType.Kind(), value)

    if res.Elem().Interface() == expectedRes {
        fmt.Println("voila")
    } else {
        fmt.Println("nuts")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...