数组
数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。在初始化后长度是固定的,无法修改其长度。当作为方法的参数传入时将复制一份数组而不是引用同一指针。数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度。
注意:和C中的数组相比,存在一些不同:
1)数组是值,将一个数组赋值给另一个数组,会拷贝所有的元素
2)数组作为函数参数,收到的是数组的一个拷贝,而不是它的指针
3)数组的大小是类型的一部分,[10]int和[20]int是不一样的
数组的初始化:
//方法一
arr1:=[4]int{
}
//方法二
arr2:=[...]int{
}
切片
数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型Slices切片(“动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。切片中有两个概念:一是len长度,二是cap容量,长度是指已经被赋过值的最大下标+1,可通过内置函数len()获得。容量是指切片目前可容纳的最多元素个数,可通过内置函数cap()获得。切片是引用类型,因此在当传递切片时将引用同一指针,修改值将会影响其他的对象。
切片初始化:
//方法一
slice:=[]int{
1,2,3}
//方法二
slice:=make([]int,len,cap)
//方法三(又数组创建)
arr:=[...]int{
1,2,3,4,5}//数组
slice:=arr[0:2]//切片
slice是引用类型,所以当引用改变其中元素的值时,其它的所有引用都会改变该值,例如下面的a和b,如果修改了b中元素的值,那么a相对应的值也会改变。
package mainimport "fmt"func main(){
a:=[]int{
1,1,1,1}b:=ab[0]=100fmt.Println("切片",a[0])a1:=[...]int{
1,1,1,1}b1:=a1b1[0]=100fmt.Println("数组",a1[0])
}
执行结果:
同样是引用类型的除了切片以外,还包括:chan、map、interface