記事「InterfaceSlice」で詳しく説明しています。
型を持つ変数[]interface{}
はインターフェイスではありません! たまたま要素型が であるスライスですinterface{}
。しかし、それを踏まえても、その意味は明らかであると言えます。
そうですね?型を持つ変数に[]interface{}
は、コンパイル時に認識される特定のメモリ レイアウトがあります。
それぞれinterface{}
が 2 つの単語を使用します (1 つの単語は含まれているものの型を表し、もう 1 つの単語は含まれているデータまたはそれへのポインターのいずれかを表します)。結果として、長さが N で type のスライスは、長さ[]interface{}
が N*2 ワードのデータのチャンクによってサポートされます。
「 golangでの意味はinterface{}
? 」も参照してください。

[]MyType
これは、タイプと同じ長さのスライスを裏付けるデータのチャンクとは異なります。そのデータのチャンクはN*sizeof(MyType)
ワード長になります。
[]MyType
その結果、 typeの何かを type の何かにすばやく割り当てることができなくなり[]interface{}
ます。それらの背後にあるデータは異なって見えるだけです。
「Goで変換できない理由[]string
[]interface{}
」は、良い例を追加します。
// imagine this is possible
var sliceOfInterface = []interface{}(sliceOfStrings)
// since it's array of interface{} now - we can do anything
// let's put integer into the first position
sliceOfInterface[0] = 1
// sliceOfStrings still points to the same array, and now "one" is replaced by 1
fmt.Println(strings.ToUpper(sliceOfStrings[0])) // BANG!