Go函数接受其他数组参数

时间:2019-05-08 15:57:47

标签: go interface

我想使用通用函数来解组不同的类型:

type Foo struct {
  Name    string
  Another string
}

type Bar struct {
  Name  string
  Some  string
}

func unmarshal(data []byte, val *[]map[string]interface{}) {
  err := json.Unmarshal(data, val)

  if err != nil || (*val)[0]["Name"] == "" {
    *val = nil
  }
}

func main() {
  var foos []Foo
  var bars []Bar

  // fooData and barData are JSON strings retrieved from database
  unmarshal(fooData, &foos)
  unmarshal(barData, &bars)
}

我遇到了类似cannot use &foo (type *[]Foo) as type *[]map[string]interface {} in argument to unmarshal的错误。

我尝试使用val interface{}作为参数,但是它不支持索引。

那我该如何实现目标?谢谢。

1 个答案:

答案 0 :(得分:2)

要使用任意切片类型,请将参数声明为类型interface{},然后使用reflection访问值:

func unmarshal(data []byte, v interface{}) {
    err := json.Unmarshal(data, v)
    rv := reflect.ValueOf(v).Elem()

    if err != nil || rv.Len() == 0 || rv.Index(0).FieldByName("Name").Interface() == "" {
        rv.Set(reflect.Zero(rv.Type()))
    }
}