是否有一种简单的方法可以将某些字段为“通用”(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
答案 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{}
。这是一个虚无的事实,而不是“一般的”事实。