3 go中数组和切片之间的区别

数组

数组的概念之前在c里面就有所以并不会很陌生,但是仍然有些区别。

数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值

在c++里面我们使用数组在传参的时候传递的都是指针,但是在go里面对数组进行赋值或者是穿参都是传值的行为。所以效率会有所降低。数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度。

定义的方法

var 变量名[len] type
var a[5] int // 3个整数的数组
var a[5] string //3个字符串的数组

//不指定长度的定义方法
var a = [...]int{1,2,3} //数组的长度由元素的个数决定

//初始化方法
var a = [5] int{1,2,3,4,5}
var a = [5] int{1,2,3}
var a = [...]int{1,2,3,4}
var a = [5]string{1:"go",3:"python"}

ps : 数组的长度也是数组类型的一部分,所以[3]int 与 [4]int其实是不同的类型

默认情况下一个新的数组的元素初始值为元素类型的零值

指针数组

var num_ptrs [10] * int

函数传递参数

func name(a [] int ) {
}
func name(a [10] int) {
}

其他关于数组的知识后面再补充,下面讲一下切片

切片

slice 表示一个拥有相同类型元素的可变长的序列。
数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,
功能强悍的内置类型Slices切片(“动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
切片中有两个概念:

 
  1. 一是len长度,二是cap容量,长度是指已经被赋过值的最大下标+1,可通过内置函数len()获得。
  2. 容量是指切片目前可容纳的最多元素个数,可通过内置函数cap()获得。
切片是引用类型,因此在当传递切片时将引用同一指针,修改值将会影响其他的对象

 
  • s :=[] int {1,2,3 } 
    直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3
  • s := arr[:] 
    初始化切片s,是数组arr的引用
  • s := arr[startIndex:endIndex] 
    将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片
  • s := arr[startIndex:] 
    缺省endIndex时将表示一直到arr的最后一个元素
  • s := arr[:endIndex] 
    缺省startIndex时将表示从arr的第一个元素开始
  • s1 := s[startIndex:endIndex] 
    通过切片s初始化切片s1
  • s :=make([]int,len,cap) 
    通过内置函数make()初始化切片s,[]int 标识为其元素类型为int的切片


 

赋值和使用

切片是引用类型,在使用时需要注意其操作。切片可以通过内置函数append(slice []Type,elems ...Type)追加元素,elems可以是一排type类型的数据,也可以是slice,因为追加的一个一个的元素,因此如果将一个slice追加到另一个slice中需要带上"...",这样才能表示是将slice中的元素依次追加到另一个slice中。另外在通过下标访问元素时下标不能超过len大小,如同数组的下标不能超出len范围一样。

  • s :=append(s,1,2,3,4)
  • s :=append(s,s1...)

slice创建

内置函数make可以创建一个具有指定元素类型、长度和容量的slice,其中容量参数可以省略,这样默认slice的长度和容量就相等了

make([]type,len,cap)
make([]type,len)

现在说说关于:
make([]type,len)
make([]type,len,cap)

其实make创建了一个无名数组并返回了它的一个slice;这个数组仅可以通过slice来访问。
第一个:make([]type,len)返回的slice引用了整个数组。
第二个:make([]type,len,cap)slice只引用了数组的前len个元素,但是它的容量是数组的长度
通过下图理解切片的创建过程:

 

关于copy

该函数主要是切片(slice)的拷贝,不支持数组
将第二个slice里的元素拷贝到第一个slice里。如果加入的两个数组切片不一样大,就会按其中较小的那个数组切片的元素个数进行复制。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章