gpt4 book ai didi

casting - 将 interface{} 转换为某种类型

转载 作者:IT王子 更新时间:2023-10-29 01:08:35 26 4
gpt4 key购买 nike

我正在开发将接收 JSON 的网络服务。 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{} 转换为特定类型的库(函数集)

更新

我的网络服务接收 JSON。我在 map[string]interface{} 中对其进行解码我无法控制对其进行编码的人。

所以我收到的所有值都是 interface{},我需要将其转换为特定类型的方法。

所以它可能是nil, int, float64, string, [... ], {...} 并且我希望将它转换为它应该的样子。例如int, float64, string, []string, map[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 package做你想要的,它可以直接与 JSON 一起工作,并会给你默认值和其他很酷的特性:

Objx provides the objx.Map type, which is a map[string]interface{} that exposes a powerful Get method (among others) that allows you to easily and quickly get access to data within the map, without having to worry too much about type assertions, missing data, default values etc.

这是用法的一个小例子:

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 accessors你可以看到一个类似于此的复杂代码,但有很多用法,所以我认为最好的解决方案是使用 objx 库。

关于casting - 将 interface{} 转换为某种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21208120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com