Golang數組類型轉換

最近寫代碼的時候會遇到類型轉換,有時候對單獨的變量強制轉換沒有問題,但要是對複雜的變量(例如數組)進行強制轉換就會出現問題。

問題1:可以將[]T1轉換爲[]T2嗎?T1和T2底層類型是一樣的。

答案是不能,看一下例子:

type T1 int
type T2 int
var t1 T1
var x = T2(t1) // OK
var st1 []T1
var sx = ([]T2)(st1) // NOT OK

在Go中,類型與方法緊密相關,因爲每個命名類型都有一個(可能爲空)方法集。一般規則是,您可以更改要轉換的類型的名稱(從而可能更改其方法集),但不能更改複合類型的元素的名稱(和方法集)。 Go要求您明確說明類型轉換。那golang中的複合類型指的是?複合類型包含指針、數組、切片、Map、結構體。所以數組類型進行強制轉換是有問題的。但是可以遍歷數組,對每個元素進行轉換,來達到想要的想過即[]T1轉換爲[]T2

問題2:可以將[]T強制轉換爲[]interface{}嗎?

答案:不行。可以遍歷數組,單個元素進行轉換,但是直接對數組整體做轉換會報錯

語言規範不允許這樣做,因爲這兩種類型在內存中的表示方式不同。有必要將元素分別複製到目標切片。此示例將int的一部分轉換爲interface {}的一部分:

t := []int{1, 2, 3, 4}
s := make([]interface{}, len(t))
for i, v := range t {
    s[i] = v
}

參看文章:
https://golang.org/doc/faq#convert_slice_with_same_underlying_type

發佈了159 篇原創文章 · 獲贊 141 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章