有没有一种直接的方法可以将某些字段为“通用”( interface{}) 的结构转换为具有相同字段名称但“强类型”( , 等) 的另一种int类型string?可以这么说,给定定义:package mainimport ( "fmt")type GenericData struct { Hard int Soft interface{}}type Data struct { Hard int Soft int}type GenericDataGenerator func() GenericDatafunc generateGenericData() interface{} { return GenericData{1, 2}}func returnsGenericDataGenerator() interface{} { return generateGenericData}GenericData从到转换是否Data需要显式转换所有interface{}字段?有没有更直接的方法来做到这一点?func main() { gd := generateGenericData() fmt.Println(gd) fmt.Println(gd.(GenericData)) // Doesn't work, but is straightforward // fmt.Println(gd.(Data)) // Works, but is not straight forward fmt.Println(Data{gd.(GenericData).Hard, gd.(GenericData).Soft.(int)}) genDataGenerator := returnsGenericDataGenerator() // Doesn't work, but is straightforward //genDataGenerator.(GenericDataGenerator)() // Works, but is not straight forward resp := genDataGenerator.(func() interface{})() fmt.Println(resp.(GenericData))}代码可以执行在: https ://play.golang.org/p/_UVBi5It1FY
1 回答
呼啦一阵风
TA贡献1802条经验 获得超6个赞
有没有一种直接的方法可以将某些字段是“通用”(interface{})的结构转换为另一种具有相同字段名称但“强类型”(int、string 等)的类型?
不。
一旦你明白这interface{}
不是某种“通用”或“任意”类型,而是一种单一的“强类型”类型,就像string
or一样,这就很明显了int32
。空接口interface{}
是一个完全正常的类型,就像 auint16
或 amap[float32]bool
一样。它是一种接口类型(与数字类型和映射类型的其他示例相反)并且它的方法集是空集。它与任何其他类型一样严格或强类型。
您可以将任何值分配给类型变量的事实interface{}
并不意味着interface{}
以某种方式表示“任何类型”。您可以将值3
,-1234
和435948
(仅举几例)分配给 a int32
。这是允许的,因为 a 的允许值范围int32
包含这些值(3、-1234、435948)。您可以将类型的值分配func(int) string
给类型的变量interface{}
,因为允许的值范围interface{}
包含func(int)string
。这是一个空洞的事实,而不是一个“通用”的事实。
- 1 回答
- 0 关注
- 98 浏览
添加回答
举报
0/150
提交
取消