目录
2.Go语言当中值传递和地址传递(引用传递)如何运用?有什么区别?
3.Go语言中的数组和切片的区别?Go语言中数组和切片在传递时候的区别是什么?Go语言是如何实现切片扩容的?
6.Go slice的底层实现? Go slice的扩容机制?
1.make和new的区别
区别:1、make只能用来分配及初始化类型为slice、map、chan的数据;而new可以分配任意类型的数据。
2、new分配返回的是指针,即类型“*Type”;而make返回引用,即Type。
3、new分配的空间会被清零;make分配空间后,会进行初始化。
2.Go语言当中值传递和地址传递(引用传递)如何运用?有什么区别?
值传递只会把参数的值复制一份放进对应的函数,两个变量的地址不同,不可相互修改。
地址传递(引用传递)会将变量本身传入对应的函数,在函数中可以对该变量进行值内容的修改。
3.Go语言中的数组和切片的区别?Go语言中数组和切片在传递时候的区别是什么?Go语言是如何实现切片扩容的?
数组:
数组固定长度数组长度是数组类型的一部分,所以[3]int 和[4]int 是两种不同的数组类型数组需要指定大小,不指定也会根据处初始化对的自动推算出大小,不可改变数组是通过值传递的
切片:
切片可以改变长度,切片是轻量级的数据结构,三个属性,指针,长度,容量不需要指定大小。切片是地址传递(引用传递)可以通过数组来初始化,也可以通过内置函数 make()来初始化,初始化的时候 len=cap,然后进行扩容。
数组是值类型,切片是引用类型;
数组的长度是固定的,而切片不是(切片是动态的数组)
切片的底层是数组
Go语言的切片扩容机制非常巧妙,它通过重新分配底层数组并将数据迁移至新数组来实现扩容。具体来说,当切片需要扩容时,Go语言会创建一个新的底层数组,并将原始数组中的数据拷贝到新数组中。然后,切片的指针指向新数组,长度更新为原始长度加上扩容的长度,容量更新为新数组的长度。
实现切片扩容:
go1.17
// src/runtime/slice.go
func growslice(et *_type, old slice, cap int) slice {
// ...
newcap := old.cap
doublecap := newcap + newcap
if cap > doublecap {
newcap = cap
} else {
if old.cap < 1024 {
newcap = doublecap
} else {
// Check 0 < newcap to detect overflow
// and prevent an infinite loop.
for 0 < newcap &&