golang之切片的操作详解 - Go语言中文社区

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)

}

 

 

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/spc15051962859/article/details/81947114
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-08-27 18:22:04
  • 阅读 ( 1006 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢