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

将自定义类型断言为基本类型

将自定义类型断言为基本类型

Go
UYOU 2023-06-26 17:15:11
是否可以将自定义类型断言为其基本类型?例如,如果我有以下内容type A []interface{}var x = map[string]interface{}{        "hello":"a",        "world":A{"b","c"},    }y := x["world"]然后,如果我尝试通过键入断言,y.([]interface{})则会收到错误//interface {} is A, not []interface {}。编辑:正如下面的答案所指出的,我可以断言通过 键入 A y.(A)。该问题源于xMongo驱动程序给出的。有些驱动程序实现了自己的类型,例如官方的 mongo 驱动程序bson.A为[]interface类型实现了类型。如果我切换驱动程序,那么我的类型断言需要更改以匹配它们的自定义类型,这是我想避免的。
查看完整描述

2 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

当对具体类型进行类型断言时,您只能对接口值中存储的相同类型进行类型断言,而不能对其基类型进行断言。当然,当您拥有具体类型时,您可以将其转换为其基本类型。

你说你想避免这种情况,你想避免必须引用具体类型。

为此,你需要反思。获取reflect.Value值的描述符,并使用该Value.Convert()方法“直接”转换为其基本类型,跳过“实际”类型。这将会成功,因为值可以转换为其基本类型的值。

当然,该Value.Convert()方法将产生一个类型的值reflect.Value(而不是[]interface{}),但是您可以interface{}使用 来获取包装该值的值Value.Interface()。您现在将拥有一个interface{}包装 type 的具体值的[]interface{},您现在可以从中键入断言 type 的值[]interface{}

看这个例子:

z := reflect.ValueOf(y).Convert(reflect.TypeOf([]interface{}{})).

    Interface().([]interface{})


fmt.Printf("%T %v", z, z)

输出(在Go Playground上尝试):


[]interface {} [b c]

这里有很多样板,这几乎不如简单的类型断言和转换那么有效。尽量避免这样做。


查看完整回答
反对 回复 2023-06-26
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

您不能键入断言变量yto []interface{},因为 的实际数据类型yA(即使A是 的别名[]interface{})。

工作示例:

fmt.Println(y.(A))

但是您可以使用conversionA将具有数据类型的变量转换为。例子:[]interface{}

w := y.(A)

x := []interface{}(w)


// or 


z := []interface{}(y.(A))


查看完整回答
反对 回复 2023-06-26
  • 2 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

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