Go中的[]interface{}是如何实现的?

How []interface{} in Go is implemented?

在 Go 中我可以做这样的事情:

func main() {
    var intSlice []interface{}
    intSlice = append(intSlice, "hello world")
    intSlice = append(intSlice, 1)
    for _, v := range intSlice {
        fmt.Println(v)   // hello world
                         // 1
    }
}

既然切片在数组的深处,没有给那个数组指定具体的类型,Go 怎么知道这个数组的内存结构的布局呢?如果它是一个 []string 那么我知道对于每次迭代我必须将当前地址与 4 相加以获得下一个项目的地址,但是对于接口{} Go 怎么知道该做什么?我很迷惑。一个可能的解释是 interface{} 实际上是一个指针,所以 []interface{} 只存储指针,值 1 或“hello world”存储在切片之外的某个地方。我说得对吗?

接口有两个值:指向值的指针和指向值类型的指针。因此,包含所有 int 值的 []interface{} 只是一个接口数组,其中每个元素都包含这两个值,数组的每个元素都指向 int 值及其类型.