数组和切片有什么区别

  • 数组是静态的,在编译期就确定了长度,切片可在运行期动态改变长度,但是切片的底层还是基于数组实现,只不过额外封装了动态扩容的功能
  • 可基于数组创建切片,反之不行
  • Go中的数组是 值类型(和其他语言不同),在栈上分配;而切片是引用类型,在堆上分配且必须使用 make 初始化(字面量是语法糖,也是使用make初始化的)。

牛客网的网友
golang中分为值类型和引用类型
值类型分别有:int系列、float系列、bool、string、数组和结构体
引用类型有:指针、slice切片、管道channel、接口interface、map、函数等
值类型的特点是:变量直接存储值,内存通常在栈中分配
引用类型的特点是:变量存储的是一个地址,这个地址对应的空间里才是真正存储的值,内存通常在堆中分配

  • 数组的长度是类型的一部分,长度不同的数组类型也是不一样的,而切片的长度不是类型的组成部分
func arrayType() {  
   var arr1 [2]int  
   var arr2 [3]int  

   contains(arr1, 1)  
   contains(arr2, 1) // 报错:Cannot use 'arr2' (type [3]int) as the type [2]int
}

func contains(arr [2]int, num int) bool { }
  • 函数传参数时,如果传递数组则每次都会进行拷贝,但是切片只会拷贝底层数组指针,所以切片使用起来更高效也更方便。
Copyright © CoffeeChat 2020 all right reserved,powered by Gitbook该文件修订时间: 2023-05-31 16:34:35

results matching ""

    No results matching ""