[英]Type assert custom type to base type
是否可以将断言一个自定义类型声明为其基本类型?
例如,如果我有以下内容
type A []interface{}
var x = map[string]interface{}{
"hello":"a",
"world":A{"b","c"},
}
y := x["world"]
然后,如果我尝试通过y.([]interface{})
键入assert y.([]interface{})
//interface {} is A, not []interface {}
。
编辑:作为下面的答案指出,我可以断言通过y.(A)
键入A。 问题源于Mongo驾驶员给出的x
。 一些驱动程序实现自己的类型,例如,正式的mongo驱动程序实现[]interface
类型的bson.A
类型。 如果我切换驱动程序,则需要更改我的类型断言以匹配其自定义类型,这是我要避免的事情。
当类型断言 (至)的具体类型,可以仅键入断言存储在接口值,而不是它的基类型相同的类型。 当然,当您具有具体类型时,可以将其转换为其基本类型。
您说过要避免这种情况,而不必避免引用具体类型。
为此,您需要反思。 获取该值的reflect.Value
描述符,并使用Value.Convert()
方法“直接”转换为其基本类型,而跳过“实际”类型。 这将成功,因为可以将值转换为其基本类型的值。
当然, Value.Convert()
方法将产生类型为reflect.Value
的值(而不是[]interface{}
),但是您可以使用Value.Interface()
获得将其包装的interface{}
值。 现在,您将有一个interface{}
,它包装了类型为[]interface{}
的具体值,您现在可以从中键入assert类型为[]interface{}
。
请参阅以下示例:
z := reflect.ValueOf(y).Convert(reflect.TypeOf([]interface{}{})).
Interface().([]interface{})
fmt.Printf("%T %v", z, z)
输出(在Go Playground上尝试):
[]interface {} [b c]
这里有很多样板,而且效率不如简单的类型声明和转换那样高效。 尝试避免这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.