等效结构上字段的接口转换

时间:2019-05-28 04:10:06

标签: go

是否有一种简单的方法可以将某些字段为“通用”(interface{})的结构转换为具有相同字段名但为“强类型”(int,{ {1}}等)?

在给出定义的前提下,让我们这样说:

string

package main import ( "fmt" ) type GenericData struct { Hard int Soft interface{} } type Data struct { Hard int Soft int } type GenericDataGenerator func() GenericData func generateGenericData() interface{} { return GenericData{1, 2} } func returnsGenericDataGenerator() interface{} { return generateGenericData } 转换为GenericData是否需要显式转换所有Data字段?有没有更简单的方法可以做到这一点?

interface{}

可以在以下位置执行代码: https://play.golang.org/p/_UVBi5It1FY

1 个答案:

答案 0 :(得分:2)

  

是否有一种简单的方法可以将某些字段为“通用”(接口{})的结构转换为另一种具有相同字段名但“强类型”(int,字符串等)的类型?

否。

一旦您了解到interface{}不是某种“泛型”或“任意”类型而是一个单一的“强类型”类型,就像string或{{1 }}。空接口int32是完全普通的类型,就像interface{}uint16一样。它是一种接口类型(与其他示例(分别是数字类型和映射类型)形成对比),其方法集为空集。与其他任何类型一样严格或强类型。

您可以为类型map[float32]bool的变量分配任何值的事实并不意味着interface{}在某种程度上意味着“任何类型”。您可以将值interface{}3-1234(仅举几例)分配给435948。之所以可以这样做是因为int32的允许值范围包含这些值(3,-1234、435948)。您可以将类型int32的值分配给类型func(int) string的变量,因为允许的值范围interface{}包含interface{}。这是一个虚无的事实,而不是“一般的”事实。