← 返回目录

扩容前后的Slice是一样的吗

第 4 / 29 卷日期:

否则判断,如果旧切片长度大于等于1024,则最终容量从旧容量开始循环,增加原来的 1/4, 直到最终容量大于等于新申请的容量

如果最终容量计算值溢出,则最终容量就是新申请容量

扩容前后的Slice是一样的吗

如果扩容后的容量仍然能够容纳新元素,系统会尽量在原地进行扩容,否则会分配一个新的数组,将原有元素复制到新数组中。

go slice的底层实现

切片本身并不是动态数组或者数组指针。它内部实现的数据结构通过指针引用底层数组,设定相关属性将数据读写操作限定在指定的区域内。切片本身是一个只读对象,其工作机制类似数组指针的一种封装。主要通过一个结构

体来表示,该结构体包含了以下三个字段:

type slice struct { array unsafe.Pointer // 指向底层数组的指针

lenint//切片的当前长度
capint//切片的容量

}

Go语言参数传递

对于基本数据类型(如整数、浮点数、布尔值等)和结构体,传递的是值的副本,修改形参的值不会影响实参。

package main

import "fmt"

func modifyValue(x int) { x = 10

}

func main() { a := 5

modifyValue(a)

fmt.Println(a) // 输出:5,因为a的值未被修改 }

对于切片、映射、通道等引用类型,传递的是引用的副本,修改形参的内容会影响到实参。

全站分卷索引 · 29 卷
  1. 1代码随想录知识星球精华(最强八股文)第五版(Go篇))
  2. 2Go string 和 []byte 的区别
  3. 3数组和切片的区别
  4. 4扩容前后的Slice是一样的吗
  5. 5Go语言map是有序的还是无序的, 为什么
  6. 6go里面的map是并发安全的吗?如何并发安全
  7. 7Go 的错误处理和 Java 的异常处理对比
  8. 8介绍一下panic和recover
  9. 9什么是defer?有什么作用
  10. 10Go并发
  11. 11进程、线程的区别
  12. 12什么是go runtine
  13. 13Go语言中的Channel是什么, 有哪些用途,如何处理阻塞
  14. 14什么是互斥锁(mutex)?在什么情况下会用到它们?
  15. 15Mutex有几种模式
  16. 16goroutine什么情况会发生内存泄漏?如何避免。
  17. 17Go语言中GC的流程是什么
  18. 18Go 中的内存逃逸现象是什么?
  19. 19CAP 理论,为什么不能同时满足
  20. 20说一下 Gin 的路由怎么实现的
  21. 21简述slice的底层原理,和数组的区别是什么
  22. 22defer底层原理
  23. 23侵入式和非侵入式的区别
  24. 24goroutine与线程的区别
  25. 25goroutine在什么情况下会被挂起呢?
  26. 26GC(垃圾回收)原理 1.5版本
  27. 27简述Go的垃圾回收机制
  28. 28协程优势及其通信方式
  29. 29Go的内存对齐