扩容前后的Slice是一样的吗
否则判断,如果旧切片长度大于等于1024,则最终容量从旧容量开始循环,增加原来的 1/4, 直到最终容量大于等于新申请的容量
如果最终容量计算值溢出,则最终容量就是新申请容量
扩容前后的Slice是一样的吗
如果扩容后的容量仍然能够容纳新元素,系统会尽量在原地进行扩容,否则会分配一个新的数组,将原有元素复制到新数组中。
go slice的底层实现
切片本身并不是动态数组或者数组指针。它内部实现的数据结构通过指针引用底层数组,设定相关属性将数据读写操作限定在指定的区域内。切片本身是一个只读对象,其工作机制类似数组指针的一种封装。主要通过一个结构
体来表示,该结构体包含了以下三个字段:
type slice struct { array unsafe.Pointer // 指向底层数组的指针
| len | int | //切片的当前长度 |
|---|---|---|
| cap | int | //切片的容量 |
}
Go语言参数传递
对于基本数据类型(如整数、浮点数、布尔值等)和结构体,传递的是值的副本,修改形参的值不会影响实参。
package main
import "fmt"
func modifyValue(x int) { x = 10
}
func main() { a := 5
modifyValue(a)
fmt.Println(a) // 输出:5,因为a的值未被修改 }
对于切片、映射、通道等引用类型,传递的是引用的副本,修改形参的内容会影响到实参。
全站分卷索引 · 29 卷
- 1代码随想录知识星球精华(最强八股文)第五版(Go篇))
- 2Go string 和 []byte 的区别
- 3数组和切片的区别
- 4扩容前后的Slice是一样的吗
- 5Go语言map是有序的还是无序的, 为什么
- 6go里面的map是并发安全的吗?如何并发安全
- 7Go 的错误处理和 Java 的异常处理对比
- 8介绍一下panic和recover
- 9什么是defer?有什么作用
- 10Go并发
- 11进程、线程的区别
- 12什么是go runtine
- 13Go语言中的Channel是什么, 有哪些用途,如何处理阻塞
- 14什么是互斥锁(mutex)?在什么情况下会用到它们?
- 15Mutex有几种模式
- 16goroutine什么情况会发生内存泄漏?如何避免。
- 17Go语言中GC的流程是什么
- 18Go 中的内存逃逸现象是什么?
- 19CAP 理论,为什么不能同时满足
- 20说一下 Gin 的路由怎么实现的
- 21简述slice的底层原理,和数组的区别是什么
- 22defer底层原理
- 23侵入式和非侵入式的区别
- 24goroutine与线程的区别
- 25goroutine在什么情况下会被挂起呢?
- 26GC(垃圾回收)原理 1.5版本
- 27简述Go的垃圾回收机制
- 28协程优势及其通信方式
- 29Go的内存对齐