int切片和string切片為什么不能轉為interface類型的切片

在給可變參數(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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯(lián)系作者。

友情鏈接更多精彩內容