猿问

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

是否可以将自定义类型断言为其基本类型?


例如,如果我有以下内容


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类型实现了类型。如果我切换驱动程序,那么我的类型断言需要更改以匹配它们的自定义类型,这是我想避免的。


UYOU
浏览 117回答 2
2回答

慕森卡

当对具体类型进行类型断言时,您只能对接口值中存储的相同类型进行类型断言,而不能对其基类型进行断言。当然,当您拥有具体类型时,您可以将其转换为其基本类型。你说你想避免这种情况,你想避免必须引用具体类型。为此,你需要反思。获取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]这里有很多样板,这几乎不如简单的类型断言和转换那么有效。尽量避免这样做。

一只萌萌小番薯

您不能键入断言变量yto []interface{},因为 的实际数据类型y是A(即使A是 的别名[]interface{})。工作示例:fmt.Println(y.(A))但是您可以使用conversionA将具有数据类型的变量转换为。例子:[]interface{}w := y.(A)x := []interface{}(w)// or z := []interface{}(y.(A))
随时随地看视频慕课网APP

相关分类

Go
我要回答