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
值及其类型.
在 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
值及其类型.