数组和切片的区别
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的初始化,返回的是引用。
数组和切片的区别
- 数组
固定长度,在声明数组时,需要指定数组的长度,且不能更改。
值类型,当将一个数组赋值给另一个数组时,会进行值拷贝。这意味着修改一个数组的副本不会影响原始数组。
数组的元素在内存中是顺序存储的,分配在一块连续的内存区域
- 切片
切片的长度可以动态调整,而且可以不指定长度。
切片是引用类型,当将一个切片赋值给另一个切片时,它们引用的是相同的底层数组。修改一个切片的元素会影响到其他引用该底层数组的切片。
切片本身不存储元素,而是引用一个底层数组。切片的底层数组会在需要时进行动态扩展。
// 创建切片
| slice1:=make([]int,3,5) | //长度为3,容量为5的切片 |
|---|---|
| slice2:=[]int{1,2,3} | //直接初始化切片 |
| slice3:=arr1[:] | //从数组截取切片 |
切片是如何扩容的
切片的扩容容量是按指数增长的。当切片的容量不足时,Go运行时系统会分配一个更大的底层数组,并将原来的元素拷贝到新数组中。新数组的大小通常是原数组的两倍(但并不一定严格遵循2倍关系)
在切片扩容时,Go运行时系统会预估未来的元素增长,并提前分配足够的空间。这可以减少频繁的内存分配和拷贝操作。
对于小切片,扩容时增加的容量可能相对较小,避免了内存的过度浪费。而对于大切片,扩容时增加的容量可
全站分卷索引 · 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的内存对齐