如何在 Golang 中传递参数?

3
我有下面的全部代码:
我希望将字符串转换为golang中的map,并使用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 参数?谢谢!


抱歉如果我漏掉了什么。我无法理解您在这里尝试通过反射等方式实现什么。最终您需要的似乎只是通过json.Unmarshal([]byte(v), &personMap)就可以实现。请参见https://play.golang.org/p/fPEikxh0lDv,您能否详细解释一下? - Ravi R
1个回答

4

您应该能够使用类型断言从接口中获取地图:

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

请参考 "如何在Golang中将值类型转换为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{}))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接