有沒有一種直接的方法可以將某些字段為“通用”( 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
??战涌?code>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 關注
- 130 瀏覽
添加回答
舉報
0/150
提交
取消