我想使用通用函数来解组不同的类型:
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{}
作为参数,但是它不支持索引。
那我该如何实现目标?谢谢。
答案 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()))
}
}