如何创建一个通用函数来解组所有类型?

时间:2015-12-23 17:13:03

标签: generics go

我在下面有一个功能,我想把它变成通用的:

func genericUnmarshalForType1(file string) Type1 {

  raw, err := ioutil.ReadFile(file)

  if err != nil {
      fmt.Println(err.Error())
      os.Exit(1)
  }

  var type1 Type1

  json.Unmarshal(raw, &type1)
}

我想创建一个接受Type1或Type2的函数,而不需要为每个类型创建一个函数。我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

json.Unmarshal的方式执行此操作:

func genericUnmarshal(file string, v interface{}) {
    // File emulation.
    raw := []byte(`{"a":42,"b":"foo"}`)
    json.Unmarshal(raw, v)
}

游乐场:http://play.golang.org/p/iO-cbK50BE

您可以通过实际返回遇到的任何错误来提高此功能。

答案 1 :(得分:0)

Go不支持泛型,但你可以这样写:

func genericUnmarshalForType1(file string) interface{} {

    raw, err := ioutil.ReadFile(file)

    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }

    var x interface{}
    if err = json.NewDecoder(raw).Decode(x); err != nil {
        return nil
    }

    return x
}

func main() {
    x := genericUnmarshalForType1("filename.json");

    var t1 Type1
    var t2 Type2

    switch t := x.(type) {
    case Type1:
        t1 = t
    case Type2:
        t2 = t
    }
}

另外,我建议您阅读有关Unmarshal使用和数据类型的http://attilaolah.eu/2013/11/29/json-decoding-in-go/