Go | 一分钟掌握Go | 5 - 切片

55 阅读2分钟

作者: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

startIndexendIndex都是可选参数,如果不写,默认分别表示第一个元素和最后一个元素,如:

// 从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中的深层拷贝吧?