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])//两次地址不一样,说明重新复制了一份
}

file
这跟 slice 的底层数组有关系,底层数组里还有额外的容量可用,append 操作将可用的元素合并到切片,并对其进行赋值,所以元素的内存地址可以取到。
如果切片的底层数组没有足够的可用容量,append 函数会创建一个新的底层数组,将被引用的现有的值复制到新数组里再追加新的值,这里也可以取到元素的新的内存地址

本作品采用《CC 协议》,转载必须注明作者和本文链接
不卑不亢,不慌不忙,这才是生活的模样。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!