将interface {}转换为特定类型

手里剑:

我正在开发将接收JSON的Web服务。Go转换类型太严格。

所以,我没有下面的函数转换interface{}bool

func toBool(i1 interface{}) bool {
    if i1 == nil {
        return false
    }
    switch i2 := i1.(type) {
    default:
        return false
    case bool:
        return i2
    case string:
        return i2 == "true"
    case int:
        return i2 != 0
    case *bool:
        if i2 == nil {
            return false
        }
        return *i2
    case *string:
        if i2 == nil {
            return false
        }
        return *i2 == "true"
    case *int:
        if i2 == nil {
            return false
        }
        return *i2 != 0
    }
    return false
}

我认为,功能还不够完善,我需要的功能转换interface{}stringintint64,等

所以我的问题是:是否存在Go将转换interface{}为某些类型的库(函数集)

更新

我的Web服务接收JSON。我对它进行解码是因为map[string]interface{}我无法控制对其进行编码的人员。

因此,我收到的所有值都是interface{},我需要将其强制转换为某些类型的方法。

因此,它可能是nilintfloat64string[...]{...},我想将它转换为它应该是什么。例如intfloat64string[]stringmap[string]string与处理的所有可能的情况包括nil,错误的价值观,等等

更新2

我收到{"s": "wow", "x":123,"y":true}{"s": 123, "x":"123","y":"true"}{a:["a123", "a234"]}{}

var m1 map[string]interface{}
json.Unmarshal(b, &m1)
s := toString(m1["s"])
x := toInt(m1["x"])
y := toBool(m1["y"])
arr := toStringArray(m1["a"])
表:

objx软件包完全可以满足您的需求,它可以直接与JSON一起使用,并为您提供默认值和其他出色功能:

Objx提供了objx.Map一种类型,该类型提供了map[string]interface{}一种强大的Get方法(以及其他方法),使您可以轻松快速地访问地图中的数据,而不必担心类型断言,数据丢失,默认值等。

这是用法的一个小例子:

o := objx.New(m1) 
s := o.Get("m1").Str() 
x := o.Get("x").Int() 
y := o.Get("y").Bool()

arr := objx.New(m1["a"])

来自使用JSON的文档示例:

// use MustFromJSON to make an objx.Map from some JSON
m := objx.MustFromJSON(`{"name": "Mat", "age": 30}`)

// get the details
name := m.Get("name").Str()
age := m.Get("age").Int()

// get their nickname (or use their name if they
// don't have one)
nickname := m.Get("nickname").Str(name)

显然,您可以在普通运行时中使用类似的方法:

switch record[field].(type) {
case int:
    value = record[field].(int)
case float64:
    value = record[field].(float64)
case string:
    value = record[field].(string)
}

但是,如果您检查objx访问器,则可以看到类似于此的复杂代码,但是有很多用法,因此,我认为最好的解决方案是使用objx库。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章