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个赞
您不能键入断言变量yto []interface{},因为 的实际数据类型y是A(即使A是 的别名[]interface{})。
工作示例:
fmt.Println(y.(A))
但是您可以使用conversionA将具有数据类型的变量转换为。例子:[]interface{}
w := y.(A)
x := []interface{}(w)
// or
z := []interface{}(y.(A))
- 2 回答
- 0 关注
- 191 浏览
添加回答
举报
