Loading... ## golang 中 make 和 new 的区别?(基本必问) 共同点: - 给变量分配内存 不同点: - 作用变量类型不同,new给string,int和数组分配内存,make给切片,map,channel分配内存; - 返回类型不一样,new返回指向变量的指针,make返回变量本身; - new 分配的空间被清零。make 分配空间后,会进行初始化; 字节的面试官还说了另外一个区别,就是分配的位置,在堆上还是在栈上?这块我比较模糊,大家可以自己探究下,我搜索出来的答案是golang会弱化分配的位置的概念,因为编译的时候会自动内存逃逸处理,懂的大佬帮忙补充下:make、new内存分配是在堆上还是在栈上? ## 数组和切片的区别 (基本必问) 相同点: - 只能存储一组相同类型的数据结构 - 都是通过下标来访问,并且有容量长度,长度通过 len 获取,容量通过 cap 获取 不同点: - 数组是定长,访问和复制不能超过数组定义的长度,否则就会下标越界,切片长度和容量可以自动扩容 - 数组是值类型,切片是引用类型,每个切片都引用了一个底层数组,切片本身不能存储任何数据,都是这底层数组存储数据,所以修改切片的时候修改的是底层数组中的数据。切片一旦扩容,指向一个新的底层数组,内存地址也就随之改变 简洁的回答: 1)定义方式不一样 2)初始化方式不一样,数组需要指定大小,大小不改变 3)在函数传递中,数组切片都是值传递。 ```go // 数组的定义 var a1 [3]int var a2 [...]int{1,2,3} // 数组的初始化 a1 := [...]int{1,2,3} a2 := [5]int{1,2,3} ``` ```go // 切片的定义 var a1 []int var a2 :=make([]int,3,5) // 切片的初始化 b:= make([]int,3,5) ``` 最后修改:2023 年 07 月 22 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏