golang中為什麼[]string 不能直接轉換[]interface{}

一、interface的泛型特性

golang中,interface是可以被任意數量的類型滿足,並且一個類型可以實現任意數量的接口。最後需要説明的是,每個類型都實現了一個空接口interface{}。任何類型(int、float、string、map、struct)都可賦值於interface{}。之前在前文( https://www.jianshu.com/p/db192f49f843 )講過了interface的結構。

二、golang中的轉換原則

In Go, there is a general rule that syntax should not hide complex/costly operations. Converting a string to an interface{} is done in O(1) time. Converting a []string to an interface{} is also done in O(1) time since a slice is still one value. However, converting a []string to an []interface{} is O(n) time because each element of the slice must be converted to an interface{}.

翻譯:

在go中,有一個共性原則:語法不應該存在複雜操作。 把string轉換成interface{} 的時間複雜度是O(1)。轉換[]string轉換成interface{},也是O(1)。但轉換[]string成[]interface{}需要的時間複雜度是O(n),因為slice中的每個元素都需要轉換成interface{}

所以從上述可以看出,[]string 不能轉換成[]interface{},是因為時間複雜度的原因,呃,這個解釋其實有點牽強。

三、深層原因

[]string是一個字符數組,內存空間是

一是帶有類型的變量[]interface{}不是接口!它是一個元素類型碰巧的切片interface{}。但即使考慮到這一點,也許可以説意義很明確。好吧,是嗎?具有類型的變量具有[]interface{}特定的內存佈局,在編譯時已知。

二是每個interface{}單詞佔用兩個成員變量(一個變量表示包含的內容,另一個變量表示包含的數據或指向它的指針)。因此,具有長度N和類型的切片[]interface{}由一長N * 2個字的數據塊支持。

這與支持具有類型[]string和相同長度的切片的數據塊不同。它的數據塊將是N * sizeof(string)字長。

結果是你不能快速地將某種類型[]MyType的東西分配給某種類型的東西[]interface{}; 它們背後的數據看起來不同

根據上述的原因,可以推導出map[string]string 、map[string]struct 不能直接轉換map[string]interface{}, []struct不能直接轉換成[]interface{}。

如果非要轉換,可以使用for 循環逐一轉換,既簡單又明瞭。