作者:Mars酱
声明:本文章由Mars酱编写,部分内容来源于网络,如有疑问请联系本人。
转载:欢迎转载,转载前先请联系我!
说明
切片和数组有点像,对于我的理解就是声明了固定长度的就是数组,而且数组不可扩展;否则就是切片
定义切片
定义切片可以直接定义,如下:
var sliceName []type
也可以使用make
函数来定义:
var sliceName []type = make([]type, length)
// 可以简写为
sliceName := make([]type, length)
make
函数的定义是这样的
make([]T, length, capacity)
[]T
:T类型的切片
length
:切片的长度
capacity
:指定容量的大小
切片初始化
// 定义一个int型的切片,里面的值分别是1,2,3,4
sliceName := []int{1,2,3,4}
回忆下数组的定义:
var array = [4]int{1,2,3,4}
[]
内有数字,表示的是数组;没有数字表示没有固定大小,就是切片。另外声明方式也不一样。
把数组切成片
我们把上面的array数组,变为切片,语法可以用:
sliceName := array[startIndex:endIndex]
我翻译下:
把array数组中从下标startIndex
开始,直到到endIndex - 1
的元素,定义为一个切片sliceName
startIndex
和endIndex
都是可选参数,如果不写,默认分别表示第一个元素和最后一个元素,如:
// 从startIndex开始直到结束
sliceName := array[startIndex:]
切片变长
数组不可增加长度,但是切片可以,我们可以通过append函数往原切片里面增加
var number []int
// 往这个空切片中增加一个数字0
number = append(number, 0)
如果你想变得更长,可以这样:
number = append(number, 1,2,3,4,5)
整体代码:
import (
"fmt"
"testing"
)
// author: mars酱
func Test_slice2(t *testing.T) {
var number []int
fmt.Println(number)
number = append(number, 0)
fmt.Println(number)
number = append(number, 1, 2, 3, 4, 5)
fmt.Println(number)
}
运行结果:
append就是往指定切片里面不断的添加内容
切片互拷
使用copy函数可以把一个切片拷贝到另一个切片中去,语法:
copy(target, source)
target
:目标切片
source
:源切片
target := []int{3, 4, 5, 6, 7}
source := []int{1, 2}
copy(target, source)
fmt.Println("--- copy之后的结果 ---")
fmt.Println(source)
fmt.Println(target)
运行上面的,能得到什么?
source
的值并没有改变
target
的值的前两位变成了source
的值
最后
切片是真的很灵活的,copy函数不太容易理解,我的理解实际是把源位置的值拷贝给目标位置的值,这应该就是java中的深层拷贝吧?