dougou6727 2019-05-08 15:57
浏览 166
已采纳

Go函数接受其他数组参数

I want to use a generic function to unmarshal different types:

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)
}

I got an error like cannot use &foo (type *[]Foo) as type *[]map[string]interface {} in argument to unmarshal.

I've tried use val interface{} as the parameter but it doesn't support index.

How can I achieve the goal then? Thanks.

  • 写回答

1条回答 默认 最新

  • duandu6497 2019-05-08 16:45
    关注

    To work with arbitrary slice types, declare the argument as type interface{} and use reflection to access the value:

    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()))
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 RL+GNN解决人员排班问题时梯度消失
  • ¥15 统计大规模图中的完全子图问题
  • ¥15 使用LM2596制作降压电路,一个能运行,一个不能
  • ¥60 要数控稳压电源测试数据
  • ¥15 能帮我写下这个编程吗
  • ¥15 ikuai客户端l2tp协议链接报终止15信号和无法将p.p.p6转换为我的l2tp线路
  • ¥15 phython读取excel表格报错 ^7个 SyntaxError: invalid syntax 语句报错
  • ¥20 @microsoft/fetch-event-source 流式响应问题
  • ¥15 ogg dd trandata 报错
  • ¥15 高缺失率数据如何选择填充方式