首页 > 解决方案 > 我应该如何在golang中传递参数?

问题描述

我有以下全部代码:

我希望 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参数?谢谢!

标签: goreflection

解决方案


您应该能够使用type assertion从界面获取地图:

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

请参阅“在 Golang 中将 Value 类型转换为 Map?

我在这里修改了你的代码
请注意,我不会尝试改变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{}))

推荐阅读