go map 和 slice
发现 golang 的 map 类型的元素比较特殊,也就是不能够取地址
禁止对 map 元素取址的原因是 map 可能随着元素数量的增长而重新分配更大的内存空间,从而可能导致之前的地址无效。想了下,感觉 slice 应该也是一样不能取地址的,因为都是引用类型,自己写代码测试了下,slice 是允许取地址操作的。
package main
import "fmt"
func main() {
s1 := make([]int,1,1)
s1[0] =1
fmt.Println(&s1[0])//可以取地址
s1 = append(s1,2)//扩容
fmt.Println(&s1[0])//两次地址不一样,说明重新复制了一份
}
这跟 slice 的底层数组有关系,底层数组里还有额外的容量可用,append 操作将可用的元素合并到切片,并对其进行赋值,所以元素的内存地址可以取到。
如果切片的底层数组没有足够的可用容量,append 函数会创建一个新的底层数组,将被引用的现有的值复制到新数组里再追加新的值,这里也可以取到元素的新的内存地址。
本作品采用《CC 协议》,转载必须注明作者和本文链接