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