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]
这里有很多样板,这几乎不如简单的类型断言和转换那么有效。尽量避免这样做。
TA贡献1795条经验 获得超7个赞
您不能键入断言变量y
to []interface{}
,因为 的实际数据类型y
是A
(即使A
是 的别名[]interface{}
)。
工作示例:
fmt.Println(y.(A))
但是您可以使用conversionA
将具有数据类型的变量转换为。例子:[]interface{}
w := y.(A)
x := []interface{}(w)
// or
z := []interface{}(y.(A))
- 2 回答
- 0 关注
- 116 浏览
添加回答
举报