我在下面有一个功能,我想把它变成通用的:
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的函数,而不需要为每个类型创建一个函数。我怎么能这样做?
答案 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/。