菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
1446
0

go map 和 slice

原创
05/13 14:22
阅读数 1551

发现 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 函数会创建一个新的底层数组,将被引用的现有的值复制到新数组里再追加新的值,这里也可以取到元素的新的内存地址

发表评论

0/200
1446 点赞
0 评论
收藏
为你推荐 换一批