2 回答

TA貢獻(xiàn)1775條經(jīng)驗 獲得超11個贊
文章“ InterfaceSlice ”嘗試詳細(xì)說明:
帶類型的變量
[]interface{}
不是接口!它是一個元素類型恰好是 的切片interface{}
。但即便如此,人們可能會說意思很清楚。嗯,是嗎?具有類型的變量具有
[]interface{}
特定的內(nèi)存布局,在編譯時已知。每個
interface{}
占用兩個字(一個字表示所包含內(nèi)容的類型,另一個字表示所包含的數(shù)據(jù)或指向它的指針)。因此,長度為 N 和類型的切片[]interface{}
由 N*2 個字長的數(shù)據(jù)塊支持。
這與支持具有類型[]MyType和相同長度的切片的數(shù)據(jù)塊不同。它的數(shù)據(jù)塊將是N*sizeof(MyType)字長。
結(jié)果是您無法快速將 type 分配給[]MyTypetype []interface{};它們背后的數(shù)據(jù)看起來不同。
“為什么[]string不能[]interface{}在 Go 中轉(zhuǎn)換為”添加了一個很好的說明:
// imagine this is possible
var sliceOfInterface = []interface{}(sliceOfStrings)
// since it's array of interface{} now - we can do anything
// let's put integer into the first position
sliceOfInterface[0] = 1
// sliceOfStrings still points to the same array, and now "one" is replaced by 1
fmt.Println(strings.ToUpper(sliceOfStrings[0])) // BANG!

TA貢獻(xiàn)1805條經(jīng)驗 獲得超10個贊
接口類型的變量存儲一對:分配給變量的具體值和該值的類型描述符。更準(zhǔn)確地說,值是實現(xiàn)接口的底層具體數(shù)據(jù)項,類型描述了該項的完整類型。
所以如果你有一個值[]T
(a slice of T
) whereT
不是一個接口,那么這種切片的元素只存儲 type 的值T
,但不存儲類型信息,它屬于切片類型。
如果您有一個 type 值[]inteface{}
,則此類切片的元素包含這些值的具體值和類型描述符。
因此 a 中的元素[]interface{}
需要比 non-interface中的更多信息(更多內(nèi)存)[]T
。如果這 2 個切片的占用內(nèi)存不相同,則不能只是“查看”不同(視為不同類型)。從另一個生產(chǎn)一個需要額外的工作。
- 2 回答
- 0 關(guān)注
- 253 瀏覽
添加回答
舉報