在給可變參數(shù)傳參時, 筆者經(jīng)常會犯一些低級錯誤。如:
cannot use (type []string) as type []interface {}和cannot use (type []int) as type []interface {}等。所以, 特地寫下這篇文章用來時時刻刻地提醒自己。
Q1: 可以將[]T轉為[]interface{}類型嘛?
答:不能直接轉,Go語言規(guī)范不允許這樣做,因為兩種類型在內存中沒有相同的表現(xiàn)形式。有必要將元素單獨復制到目標切片。下面的例子將一個[]int轉換為[]interface{}:
t := []int{1, 2, 3, 4}
s := make([]interface{}, len(t))
for i, v := range t {
s[i] = v
}
Q2: 如果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中,類型與方法密切相關,每一個命名類型都有一個(可能是空的)方法集。一般規(guī)則是,可以更改要轉換的類型的名稱(從而可以更改其方法集),但不能更改復合類型的元素的名稱(和方法集)。Go要求您明確說明類型轉換。
注:上述內容翻譯自https://golang.org/doc/faq#convert_slice_of_interface