切换导航
{{systemName}}
{{ info.Title }}
{{info.Title}}
{{ menu.Title }}
{{menu.Title}}
登录
|
退出
搜索
讲讲 Go 的 slice 底层数据结构和一些特性?
作者:ych
答:Go 的 slice 底层数据结构是由一个 array 指针指向底层数组,len 表示切片长度,cap 表示切片容量。slice 的主要实现是扩容。对于 append 向 slice 添加元素时,假如 slice 容量够用,则追加新元素进去,slice.len++,返回原来的 slice。当原容量不够,则 slice 先扩容,扩容之后 slice 得到新的 slice,将元素追加进新的 slice,slice.len++,返回新的 slice。对于切片的扩容规则:当切片比较小时(容量小于 1024),则采用较大的扩容倍速进行扩容(新的扩容会是原来的 2 倍),避免频繁扩容,从而减少内存分配的次数和数据拷贝的代价。当切片较大的时(原来的 slice 的容量大于或者等于 1024),采用较小的扩容倍速(新的扩容将扩大大于或者等于原来 1.25 倍),主要避免空间浪费,网上其实很多总结的是 1.25 倍,那是在不考虑内存对齐的情况下,实际上还要考虑内存对齐,扩容是大于或者等于 1.25 倍。 (关于刚才问的 slice 为什么传到函数内可能被修改,如果 slice 在函数内没有出现扩容,函数外和函数内 slice 变量指向是同一个数组,则函数内复制的 slice 变量值出现更改,函数外这个 slice 变量值也会被修改。如果 slice 在函数内出现扩容,则函数内变量的值会新生成一个数组(也就是新的 slice,而函数外的 slice 指向的还是原来的 slice,则函数内的修改不会影响函数外的 slice。)
相关推荐
golang 中解析 tag 是怎么实现的?反射原理是什么?(中高级肯定会问,比较难,需要自己多去总结)
使用gorm不当出现too Many Connections的问题
golang map 使用注意的点,是否并发安全?
uint 类型溢出问题
Golang中defer和return执行的先后顺序
golang orm框架 gorm
讲讲 Go 的 select 底层数据结构和一些特性?(难点,没有项目经常可能说不清,面试一般会问你项目中怎么使用select)
golang中两个变量值的4种交换方式
golang进行封包和拆包的完整解决方案
对已经关闭的 chan 进行读写,会怎么样?为什么?
调用函数传入结构体时,应该传值还是指针? (Golang 都是传值)
为 sync.WaitGroup 中Wait函数支持 WaitTimeout 功能.
Golang空结构体 struct{} 的使用
Golang 单引号,双引号,反引号的区别?
Golang判断slice是否相等
单例模式的应用场景
go defer,多个 defer 的顺序,defer 在什么时机会修改返回值?
讲讲 Go 的 defer 底层数据结构和一些特性?
Golang表示枚举类型的详细讲解
序列化协议
昨天那个在for循环里append元素的同事,今天还在么?
golang并发题目测试
什么是死锁?死锁产生的原因?如何避免死锁?
B+树为什么快
交替打印数字和字母
golang面试题
数组和切片的区别 (基本必问)
for range 的时候它的地址会发生变化么?
复利计算 递归/非递归
机器人坐标问题
在 golang 协程和channel配合使用
实现阻塞读且并发安全的map
MySQL索引原理
高并发下的锁与map的读写
写出以下逻辑,要求每秒钟调用一次proc并保证程序不退出?
判断两个给定的字符串排序后是否一致
常见语法题目2
golang 实现一个负载均衡案例(随机,轮训)
ElasticSearch使用场景
Redis的优点
字符串替换问题
七道语法找错题目
golang 中 make 和 new 的区别?(基本必问)
判断字符串中字符是否全都不同
redis缓存穿透、缓存击穿、缓存雪崩原因+解决方案
常见语法题目1
基本数据结构和算法
消息队列使用的场景介绍
redis在项目中的使用
操作系统基本原理
翻转字符串
TiDB使用场景
评论区
先去登录
版权所有:机遇屋在线 Copyright © 2021-2025 jiyuwu Co., Ltd.
鲁ICP备16042261号-1