为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
一只名叫tom的猫 2021-11-29 19:13:05
我在下面有一个函数,我想让它通用: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 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

以同样的方式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。


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


查看完整回答
反对 回复 2021-11-29
?
隔江千里

TA贡献1906条经验 获得超10个赞

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

    }

}

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


查看完整回答
反对 回复 2021-11-29
  • 2 回答
  • 0 关注
  • 166 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信