【发布时间】:2023-03-12 05:20:01
【问题描述】:
当我有一个可靠的 rest api 端点返回一些简单的 json 时,我可以使用结构来准确定义预期 json 结果的结构,但是我必须使用某些端点返回非常大和复杂的 json 结果数据,而且这些结果的结构并不总是已知的。
我一直在使用它来解组:
type JsonObj map[string]interface{}
func (jo JsonObj) GetString(name string) (string, error) {
if val, exists := jo[name]; exists {
if v, ok := val.(string); ok {
return v, nil
}
return "", errors.New(name+" is not a string")
}
return "", errors.New(name+" property not found")
}
func (jo JsonObj) GetFloat64(name string) (float64, error) {
if val, exists := jo[name]; exists {
if v, ok := val.(float64); ok {
return v, nil
}
return 0, errors.New(name+" is not a float64")
}
return 0, errors.New(name+" property not found")
}
以同样的方式我有GetInt,GetBool,GetSlice,GetJsonObj,
但正如您所见,除了类型断言参数之外,所有这些函数在内容上几乎相同。有没有办法传入类型断言参数来有效地将所有这些函数简化为一个函数?
【问题讨论】:
-
这被称为“泛型”或“模板”,它们在 Go 中不可用(我希望它是临时的 :-) 但您可能可以生成这些函数。
-
是的,我知道它是泛型,而 go 没有它们,但有时一些聪明人会想出一些方法来减少重复代码的数量。
-
我明白了。抱歉,没有这样的方法 :) 例如,因为没有办法“模板化”输出类型。
-
请注意,Go 中的 getter 写成 without the Get prefix。
-
如何使用反射。那么
GetString可以是Get(Kind.String)
标签: json go type-assertion