← 返回目录

数组和切片的区别

第 3 / 29 卷日期:

import "fmt"

func main() { // 使用 make 创建并初始化切片

slice := make([]int, 5, 10)

fmt.Println(slice) // 输出:[0 0 0 0 0]

// 使用 new 分配整数类型的内存,并返回指针 ptr := new(int)

fmt.Println(*ptr) // 输出:0 }

总结:

new只用于分配内存,返回一个指向地址的指针。它为每个新类型分配一片内存,初始化为0且返回类型*T的内存地址,它相当于&T{}

make只可用于slice,map,channel的初始化,返回的是引用。

数组和切片的区别

  1. 数组

固定长度,在声明数组时,需要指定数组的长度,且不能更改。

值类型,当将一个数组赋值给另一个数组时,会进行值拷贝。这意味着修改一个数组的副本不会影响原始数组。

数组的元素在内存中是顺序存储的,分配在一块连续的内存区域

  1. 切片

切片的长度可以动态调整,而且可以不指定长度。

切片是引用类型,当将一个切片赋值给另一个切片时,它们引用的是相同的底层数组。修改一个切片的元素会影响到其他引用该底层数组的切片。

切片本身不存储元素,而是引用一个底层数组。切片的底层数组会在需要时进行动态扩展。

// 创建切片

slice1:=make([]int,3,5)//长度为3,容量为5的切片
slice2:=[]int{1,2,3}//直接初始化切片
slice3:=arr1[:]//从数组截取切片

切片是如何扩容的

切片的扩容容量是按指数增长的。当切片的容量不足时,Go运行时系统会分配一个更大的底层数组,并将原来的元素拷贝到新数组中。新数组的大小通常是原数组的两倍(但并不一定严格遵循2倍关系)

在切片扩容时,Go运行时系统会预估未来的元素增长,并提前分配足够的空间。这可以减少频繁的内存分配和拷贝操作。

对于小切片,扩容时增加的容量可能相对较小,避免了内存的过度浪费。而对于大切片,扩容时增加的容量可

全站分卷索引 · 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的内存对齐