Изменение значений структуры, переданной по ссылке - PullRequest
0 голосов
/ 27 октября 2018

Я хотел бы передать структуру в качестве ссылки на функцию и на основе ее типа, идентифицированного отражением, выполнить соответствующие преобразования и сохранить значение в самой структуре.

ОДНАКО, хотя код выполняется, а значения идентифицируются и преобразуются внутри функции, когда элемент управления возвращается к функции main (), структура не имеет значений, которые я хотел бы сохранитьтам.

Вот код:

package main

import (
    "fmt"
    "reflect"
    "strconv"
)

type x struct {
    f1 string
    f2 int
    f3 bool
}

func main() {
    s := x{}
    getData(&s.f1, "AAA")
    getData(&s.f2, "1")
    getData(&s.f3, "true")
    fmt.Println(s)

}
func getData(data interface{}, value string) {
    if value != "" {
        switch reflect.TypeOf(data).String() {
        case "*int":
            data, _ = strconv.Atoi(value)
        case "*bool":
            data, _ = strconv.ParseBool(value)
        case "*string":
            data = value
        }
    }
}

В этом примере я получаю { 0 false}, ожидая { AAA 1 true}

Есть ли Golang GURU что может подсказать, что я делаю не так с этим кодом?

Ниже ссылки для перехода на игровую площадку https://play.golang.org/p/l1_INJLOhAq

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Используйте переключатель типа для выполнения кода в зависимости от типа значения. В этом сценарии нет необходимости использовать отражение.

func getData(data interface{}, value string) {
    if value != "" {
        switch data := data.(type) {
        case *int:
            *data, _ = strconv.Atoi(value)
        case *bool:
            *data, _ = strconv.ParseBool(value)
        case *string:
            *data = value
        }
    }
}

Больше информации о типах переключателей: Go Tour , Go Спецификация , Effective Go .

0 голосов
/ 27 октября 2018

Вам нужно использовать reflect.Value.Elem(), чтобы получить фактическое значение, а не сам указатель.

Вот краткая суть:

func getData(data interface{}, value string) {

    switch v := data.(type) {
    case *int:
        val := reflect.ValueOf(v).Elem()
        intVal, _ := strconv.Atoi(value)
        val.SetInt(int64(intVal))
    }
}

Я предлагаю вам прочитать Законы отражения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...