sponsored links

golang之切片的操作详解

基础知识:

-其本身并不是数组,silce指向底层的数组

-作为变长数组的替代方案,可以关联底层数组的局部与全部

-为引用类型

-可以直接创建或从底层数组获取生成

-使用len()获取元素个数,cap()获取容量

-若果多个silce指向相同底层数组,其中一个的值改变会影响全部

声明:make([] T,len,cap)



切片使用:欺骗默认指向一段连续内存区域,可以使数组,也可以是切片本身

从数组生成切片:

var a = [3] int {1,2,3} //创建数组

fmt.Println(a,a[1:2]) //1代表起始位置,2代表终止位置

输出:[1,2,3] [2]

1、从指定位置生成切片

a[x:y] //x是起始位置,y是终止位置

2、表示原有切片

a[:]

3、清空切片:

a[0:0]

声明切片:

var name [ ]  T

//声明字符串切片

var strList [ ] string

//声明整型切片

var numList [ ] int

//声明一个空切片

var numListEmpty = [ ] int { }

使用make()函数构造切片

make([ ]T,size,cap) //T切片类型,size分配元素个数,cap切片容量

例子:func函数中

a:= make([ ]int,2) //默认容量为元素个数

b:= make([ ]int,2,10)//元素个数2,容量10     切片的容量根据根据元素个数成倍增长

fmt.Println(a,b)

fmt.Println(len(a),len(b))

输出:[0,0] [0,0]

2 , 2

使用append()函数为切片添加元素

格式:append(数组名,元素1,元素2,元素3……) //元素的添加个数可以是一个也可以是多个

例子:

var car [ ] string

car = append(car,"hello")//单个添加

car = append(car,"world","and","go","!")

添加切片

carComponent := [ ] string (“hello”,“I”,“am”,“C++”) //声明切片

car = append(car,team) //添加切片

fmt.Println(car)

输出结果:[hello world and go ! hello I am C++]

切片的复制:

copy(destSilce,srcSlice  [ ] T) int //destSilce为复制目标,srcSlice切片来源

package main

import "fmt"

func main() {

// 设置元素数量为1000

const elementCount = 1000

// 预分配足够多的元素切片

srcData := make([]int, elementCount)

// 将切片赋值

for i := 0; i < elementCount; i++ {

srcData[i] = i

}

// 引用切片数据,此时的切片传递的是地址值

refData := srcData

// 预分配足够多的元素切片

copyData := make([]int, elementCount)

// 将数据复制到新的切片空间中,此时数据复制只存在值的copy过程与地址无关

copy(copyData, srcData)

// 修改原始数据的第一个元素

srcData[0] = 999

// 打印引用切片的第一个元素

fmt.Println(refData[0])

// 打印复制切片的第一个和最后一个元素

fmt.Println(copyData[0], copyData[elementCount-1])

// 复制原始数据从4到6(不包含)

copy(copyData, srcData[4:6])

for i := 0; i < 5; i++ {

fmt.Printf("%d \n", copyData[i])

}

}

输出结果:

999

0 999

4

5

2

3

4

从切片中删除元素:

package main

import "fmt"

func main() {

seq := []string{"a", "b", "c", "d", "e"}

// 指定删除位置

index := 2

// 查看删除位置之前的元素和之后的元素,并依此将删除元素之前的元素按序打印,删除元素之后的元素按序打印

fmt.Println(seq[:index], seq[index+1:])

// 删除指定元素之后,删除点前后元素连接起来,将剩余元素按序打印

seq = append(seq[:index], seq[index+1:]...)

fmt.Println(seq)

}

基础知识:

-其本身并不是数组,silce指向底层的数组

-作为变长数组的替代方案,可以关联底层数组的局部与全部

-为引用类型

-可以直接创建或从底层数组获取生成

-使用len()获取元素个数,cap()获取容量

-若果多个silce指向相同底层数组,其中一个的值改变会影响全部

声明:make([] T,len,cap)



切片使用:欺骗默认指向一段连续内存区域,可以使数组,也可以是切片本身

从数组生成切片:

var a = [3] int {1,2,3} //创建数组

fmt.Println(a,a[1:2]) //1代表起始位置,2代表终止位置

输出:[1,2,3] [2]

1、从指定位置生成切片

a[x:y] //x是起始位置,y是终止位置

2、表示原有切片

a[:]

3、清空切片:

a[0:0]

声明切片:

var name [ ]  T

//声明字符串切片

var strList [ ] string

//声明整型切片

var numList [ ] int

//声明一个空切片

var numListEmpty = [ ] int { }

使用make()函数构造切片

make([ ]T,size,cap) //T切片类型,size分配元素个数,cap切片容量

例子:func函数中

a:= make([ ]int,2) //默认容量为元素个数

b:= make([ ]int,2,10)//元素个数2,容量10     切片的容量根据根据元素个数成倍增长

fmt.Println(a,b)

fmt.Println(len(a),len(b))

输出:[0,0] [0,0]

2 , 2

使用append()函数为切片添加元素

格式:append(数组名,元素1,元素2,元素3……) //元素的添加个数可以是一个也可以是多个

例子:

var car [ ] string

car = append(car,"hello")//单个添加

car = append(car,"world","and","go","!")

添加切片

carComponent := [ ] string (“hello”,“I”,“am”,“C++”) //声明切片

car = append(car,team) //添加切片

fmt.Println(car)

输出结果:[hello world and go ! hello I am C++]

切片的复制:

copy(destSilce,srcSlice  [ ] T) int //destSilce为复制目标,srcSlice切片来源

package main

import "fmt"

func main() {

// 设置元素数量为1000

const elementCount = 1000

// 预分配足够多的元素切片

srcData := make([]int, elementCount)

// 将切片赋值

for i := 0; i < elementCount; i++ {

srcData[i] = i

}

// 引用切片数据,此时的切片传递的是地址值

refData := srcData

// 预分配足够多的元素切片

copyData := make([]int, elementCount)

// 将数据复制到新的切片空间中,此时数据复制只存在值的copy过程与地址无关

copy(copyData, srcData)

// 修改原始数据的第一个元素

srcData[0] = 999

// 打印引用切片的第一个元素

fmt.Println(refData[0])

// 打印复制切片的第一个和最后一个元素

fmt.Println(copyData[0], copyData[elementCount-1])

// 复制原始数据从4到6(不包含)

copy(copyData, srcData[4:6])

for i := 0; i < 5; i++ {

fmt.Printf("%d \n", copyData[i])

}

}

输出结果:

999

0 999

4

5

2

3

4

从切片中删除元素:

package main

import "fmt"

func main() {

seq := []string{"a", "b", "c", "d", "e"}

// 指定删除位置

index := 2

// 查看删除位置之前的元素和之后的元素,并依此将删除元素之前的元素按序打印,删除元素之后的元素按序打印

fmt.Println(seq[:index], seq[index+1:])

// 删除指定元素之后,删除点前后元素连接起来,将剩余元素按序打印

seq = append(seq[:index], seq[index+1:]...)

fmt.Println(seq)

}

golang之切片的操作详解

Tags: