繁体   English   中英

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

[英]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]

这里有很多样板,而且效率不如简单的类型声明和转换那样高效。 尝试避免这样做。

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

工作示例:

fmt.Println(y.(A))

但是你可以转换可变与A数据类型到[]interface{}通过使用转换 例:

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

// or 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM