在学习go基础语法时,遇到两种数据类型:数组和切片。感觉容易混淆,特别记录一下。
1、描述
(1)数组
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。
数组是值类型,将一个数组赋值给另一个数组时将复制一份新的元素
(2)切片
切片是对数组的抽象。
Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
切片是引用类型,因此在当传递切片时将引用同一指针,修改值将会影响其他的对象。
即当一个切片作为参数传递给一个函数时,函数对该切片的修改在函数外部也可以看到。
2、定义与初始化
slice和数组在声明时的区别:声明数组时,方括号内写明了数组的长度或使用…自动计算长度,而声明slice时,方括号内没有任何字符。
(1)数组
数组声明需要指定元素类型及元素个数
var variable_name [SIZE]variable_type
//例如:
var array [10]int
初始化数组:
var array = [5]int{1, 2, 3, 4, 5} //初始化数组中 {} 中的元素个数不能大于 [] 中的数字。
var array1 = [...]int{1, 2, 3, 4, 5}//如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小
(2)切片
声明一个未指定大小的数组来定义切片:
//(1)
var identifier []type
//例如:
var numbers []int //切片不需要说明长度。
//(2)使用make
var slice1 []type = make([]type, len, cap)
初始化切片:
s :=[] int {1,2,3 } //直接初始化切片
s := arr[:] // arr是数组,可以从arr初始化切片s,是数组arr的引用
s1 := s[startIndex:endIndex] //s是切片,切片s初始化切片s1
注意以下代码:
var slice []int
var array = [...]int{1, 2, 3, 4, 5}
slice = array[1:3] #slice:[2 3]
slice[0] = 10 # slice:[10 3] array:[1 10 3 4 5]
slice是数组array的引用 ,当slice修改后,array也跟着发生了变化。
切片本身不包含任何数据。它仅仅是底层数组的一个上层表示。对切片进行的任何修改都将反映在底层数组中
3、切片相关操作
切片用得比较多,因此了解一下切片相关的操作。
(1)copy()
var slice []int
var array = [...]int{1, 2, 3, 4, 5}
slice = array[1:3]
slice2 := make([]int, len(slice), cap(slice))
copy(slice2, slice)
slice[0] = 10
注:必须创建一个新的至少比原切片更大的切片,才能把原分片的内容都拷贝过来。
拷贝后,原切片的修改不影响新切片。
(2)append与… 操作符
append() 用于追加元素
var slice []int
var array = [...]int{1, 2, 3, 4, 5}
slice = array[1:3] //slice :[2 3]
slice2 := append(slice, 10) //slice :[2 3] slice2 :[2 3 10]
slice3 := append(slice, slice2...)//slice :[2 3] slice2 :[2 3 10] slice3: [2 3 2 3 10]
(3)len() 和 cap() 函数
- len():获取切片长度
- cap(): 获取切片容量
(4)切片元素的删除和插入操作
删除头部元素
var slice = []int{1, 2, 3, 4, 5}
slice =slice[1:]
删除尾部元素
var slice = []int{1, 2, 3, 4, 5}
slice = slice[:len(slice)-1]
删除中间元素
var slice = []int{1, 2, 3, 4, 5}
slice = append(slice[:1], slice[3:]...)
插入头部元素
var slice = []int{1, 2, 3, 4, 5}
slice = append([]int{10}, slice...) //[10 1 2 3 4 5]
插入中间元素
var slice = []int{1, 2, 3, 4, 5}
rear := append([]int{}, slice[2:]...) //保存后部剩余元素,必须新建一个临时切片
slice = append(slice[:2], 10)
slice = append(slice, rear...)
printSlice(slice)