Как я должен передать param в golang? - PullRequest
0 голосов
/ 10 июня 2018

У меня есть следующие целые коды:

Я надеюсь, что строка преобразует карту в golang и использует golang отражать.

Следующий код упрощен из моего проекта.

package main

import (
    "encoding/json"
    "fmt"
    "reflect"
)

func main() {
    jsonStr := `{"name": "thinkerou", "age": 31, "balance": 3.14}`

    var a map[string]interface{}
    var value reflect.Value = reflect.ValueOf(&a)

    // call function and pass param
    f(jsonStr, value)

    // print result
    fmt.Println(value.Kind(), value.Interface())
}

func f(v string, value reflect.Value) {
    personMap := make(map[string]interface{})

    err := json.Unmarshal([]byte(v), &personMap)

    if err != nil {
        panic(err)
    }

    value = reflect.Indirect(value)
    value = reflect.MakeMap(value.Type())
    for k, v := range personMap {
        // set key/value
        value.SetMapIndex(reflect.ValueOf(k), reflect.ValueOf(v))
    }

    // print result
    fmt.Println(value.Kind(), value.Interface())
}

и запустите его и получите результат:

map map[age:31 balance:3.14 name:thinkerou]
ptr &map[]

Я надеюсь, что следующий результат:

map map[age:31 balance:3.14 name:thinkerou]
map map[age:31 balance:3.14 name:thinkerou]

Как мне передать reflect.Value param?спасибо!

1 Ответ

0 голосов
/ 10 июня 2018

Вы должны иметь возможность получить карту из интерфейса, используя утверждение типа :

a := i.(map[string]interface{})

См. " Преобразовать тип значения в карту на Голанге? "

Я изменил ваш код здесь .
Обратите внимание, что я не пытаюсь изменить аргумент f(value), но вместо этого возвращаю его.

func f(v string, value reflect.Value) reflect.Value {
  ...
  return value 
}

Таким образом, код становится:

value = f(jsonStr, value)
fmt.Println(value.Kind(), value.Interface().(map[string]interface{}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...