Go语言学习之使用切片|Go主题月

551 阅读4分钟

作者:看那个码农

公众号:看那个码农

上期内容介绍了Go语言学习之数组|Go主题月

  • 数组的定义
  • 数组的声明
  • 初始化数组
  • 遍历数组元素
  • 数组的一道典型案例

本篇内容将继续带领大家走进Go语言的世界。

1.本文简介

Go语言学习之使用切片

2.切片的使用

在Go语言中,数组是一个重要构件,但是使用切片的情况更多。

切片的内部结构包含地址、大小和容量

切片一般用于快速地操作一块数据集合。如果将数据结合比做切糕的话,切片就是用户要的“那一块”。

切的过程包含从哪里开始(即切片的地址)及切多大(即切片的大小),容量可以理解为装切片的口袋大小。

如下图所示:

image.png

3.为什么要用切片?

在Go语言中,使用数组存在一定的局限性,无法直接向数组中添加元素,切片比数组灵活,,用户可以在切片中快速实现添加与删除元素操作。

4.声明切片

每一种类型都可以拥有其切片类型,表示多个类型元素的连续集合。切片类型的声明格式如下:

var name []T

  • name表示切片类型的变量名
  • T表示切片类型对应的元素类型。

5.使用make函数构造切片

如果需要动态创建一个切片,可以使用make内建函数,格式如下:

make([]T, size, cap)

  • T:切片的元素类型
  • size:就是为这个类型分配多少个元素
  • cap:预分配的元素数量,这个值设定后不影响size,只是能提前分配空间,降低多次分配空间造成的性能问题。

如下面的案例所示:

package main

import (
   "fmt"
)

func main(){
   a := make([]int,2)
   b := make([]int,2,10)
   fmt.Printf("切片a的长度:%v,切片b的长度:%v",len(a),len(b))
}

输出为:

image.png

a和b均是预分配2个元素的切片,只是b的内部存储空间已经分配了10个,但实际使用了2个元素,容量不会影响当前的元素个数,因此a和b的长度都是2.

6.从数组或切片生成新的切片

切片默认指向一段连续内存区域,可以是数组,可以是切片本身。

常见的切片使用格式如下:

slice [开始位置:结束位置]

  • slice:表示目标切片对象
  • 开始位置表示对应目标切片对象的索引。
  • 结束位置表示对应目标切片的结束索引。

如下面的案例所示:

package main

import (
   "fmt"
)

func main(){
   var a = [3]int{1,2,3}
   fmt.Printf("数组:%v,处理后切片:%v",a,a[1:2])
}

输出为

image.png

7.表示原有的切片

生成切片的格式中,当开始和结束的位置都为

则生成的切片将表示和原切片一致的切片,并且生成的切片与原切片在数据内容上的一致。

具体代码实现如下:

package main

import (
   "fmt"
)

func main(){
   a := []int{1,2,3}
   fmt.Printf("原有切片:%v,生成的切片:%v",a,a[:])
}

输出为

image.png

8.重置切片,清空拥有的元素

把切片的开始和结束位置都设为0时,生成的切片将变空

具体代码如下:

package main

import (
   "fmt"
)

func main(){
   a := []int{1,2,3}
   fmt.Printf("原有切片:%v,清空后的切片:%v",a,a[0:0])
}

输出为

image.png

9.在切片中添加元素

Go语言使用内置函数append()可以为切片动态添加元素。

具体代码如下:

package main

import "fmt"

func main(){
   var str = make([]string,2)
   str[0]  = "First"
   str[1]  = "Second"
   fmt.Printf("原切片为:%v\n",str)
   str =append(str,"Third")
   fmt.Printf("增加元素后的切片为:%v",str)
}

输出为:

image.png

10.在切片中删除元素

在切片中删除元素,也可使用内置函数append()来完成。

删除元素的本质其实是以删除元素为分界点,将前后两个部分的内存重新连接起来。

代码删除的过程可以用下图来表示:

image.png

具体代码如下:

package main

import "fmt"

func main(){
   str := []string{"a","b","c","d","e"}
   index :=2
   fmt.Printf("删除位置之前的元素:%v,\n删除的元素为:%v,\n删除位置之后的元素:%v,\n",str[:index],str[index],str[index+1:])
   str=append(str[:index],str[index+1:]...)
   fmt.Printf("删除元素后的切片为:%v",str)
}

输出为:

image.png

11.复制切片中的元素

要复制切片中的全部或者部分元素,可使用内置函数copy()

在复制切片中的元素前,必须要再声明一个类型与该切片类型相同的切片

具体代码如下所示:

package main

import "fmt"

func main(){
   var str=make([]string,2)
   var copystr=make([]string,2)
   str[0]="a"
   str[1]="b"
   copy(copystr,str)
   fmt.Println(copystr)
}

输出为:

image.png

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。