Go语言 切片slice

本文内容为Go语言中切片(slice)概念、定义、特性及使用示例。

目录

切片(slice)

定义切片

不设置长度

追加数据

长度与容量

基于数组创建切片

常用切片方式

修改值

总结


切片(slice)

切片:slice,它的底层也是数组,是一种不定长的数组可以动态改变长度。

定义切片

定义一个切片,包含多个城市名称。

示例如下:

Go 复制代码
package main

import "fmt"

func main() {
   // 定义一个切片,包含多个城市名称
   citys := [10]string{"北京", "天津", "上海", "深圳", "重庆"}
   for key, val := range citys {
      fmt.Println(key, "=>", val)
   }
}

打印时除了前五个出现城市名外,其他的都是待填充的,显示空值。

不设置长度

还可以在定义切片时不设置长度。

示例如下:

Go 复制代码
citys := []string{"北京", "天津", "上海", "深圳", "重庆"}
for key, val := range citys {
   fmt.Println(key, "=>", val)
}

追加数据

在定义好的切片中追加数据。

示例如下:

Go 复制代码
fmt.Println("追加元素前,citys长度:", citys, ", 容量:", cap(citys))
citys = append(citys, "邯郸")
fmt.Println("追加元素后,citys长度:", citys, ", 容量:", cap(citys))

运行结果:

bash 复制代码
追加元素前,citys长度: [北京 天津 上海 深圳 重庆] , 容量: 5
追加元素后,citys长度: [北京 天津 上海 深圳 重庆 邯郸] , 容量: 10

长度与容量

对于一个切片,不仅有长度的概念len(),还有一个容量的概念cap()。

示例如下:

Go 复制代码
nums := []int{}
for i := 0; i < 10; i++ {
   nums = append(nums, i)
   fmt.Println("长度:", len(nums), ",容量:", cap(nums))
}

运行结果:

bash 复制代码
长度: 1 ,容量: 1
长度: 2 ,容量: 2
长度: 3 ,容量: 4
长度: 4 ,容量: 4
长度: 5 ,容量: 8
长度: 6 ,容量: 8
长度: 7 ,容量: 8
长度: 8 ,容量: 8
长度: 9 ,容量: 16
长度: 10 ,容量: 16

说明:切片可以使用append进行追加数据

len获取长度,cap获取容量

如果容量不足,再次追加数据时,会动态分配2倍空间

基于数组创建切片

对数组内容的引用,如果修改切片也会修改数组的值;

数组改变,切片值也会改变。

示例如下:

Go 复制代码
package main

import "fmt"

func main() {
   // 基于数组创建切片
   citys := [7]string{"北京", "天津", "上海", "深圳", "重庆", "开封", "哈尔滨"}

   // 基于citys创建一个新的数组
   city1 := [3]string{}
   city1[0] = citys[0]
   city1[1] = citys[1]
   city1[2] = citys[2]
   fmt.Println("新数组city1:", city1)

   // 切片可以基于一个数组,灵活的创建新的数组
   city2 := citys[0:3]
   fmt.Println("切片city2:", city2)

   // 数组改变,切片值也会随之修改。
   citys[0] = "北京1"
   fmt.Println(city1)
   fmt.Println(city2)
}

运行结果:

bash 复制代码
新数组city1: [北京 天津 上海]
切片city2: [北京 天津 上海]
[北京 天津 上海]
[北京1 天津 上海]

常用切片方式

如果从0元素开始截取,那么冒号左边的数字可以省略

示例如下:

Go 复制代码
citys := [10]string{"北京", "天津", "上海", "深圳", "唐山", "石家庄", "秦皇岛", "保定", "邯郸", "邢台"}
name1 := citys[:3]
fmt.Println(name1)

如果截取到数组最后一个元素,那么冒号右边的数字可以省略

示例如下:

Go 复制代码
citys := [10]string{"北京", "天津", "上海", "深圳", "唐山", "石家庄", "秦皇岛", "保定", "邯郸", "邢台"}
name2 := citys[3:6]
fmt.Println(name2)

如果想从左到右全部使用,那么冒号左右两边的数字都可以省略

示例如下:

Go 复制代码
citys := [10]string{"北京", "天津", "上海", "深圳", "唐山", "石家庄", "秦皇岛", "保定", "邯郸", "邢台"}
name3 := citys[:]
fmt.Println(name3)

也可以基于字符串进行切片截取。

示例如下:

Go 复制代码
str1 := "helloWorld"[3:5]
fmt.Println(str1) // lo

可以在创建空切片的时候,明确指定切片的容量,这样可以提高运行效率

创建一个容量是20,当前长度是0的string类型切片

示例如下:

Go 复制代码
str2 := make([]string, 10, 20) // 第三个参数不是必须的,如果没有填写,则默认与长度相同
fmt.Println("str2 长度:", len(str2), ", 容量:", cap(str2))
str2[0] = "hello"
str2[1] = "world"
fmt.Println("str2", str2)

如果想让切片完全的独立于原始数组,可以使用copy()函数实现

示例如下:

Go 复制代码
cityCopy := make([]string, len(citys))
copy(cityCopy, citys[:])
fmt.Println(cityCopy)

name[:]解释:函数原型接收参数时要求时切片,如果参数为数组,需要转换为切片

修改值

独立于数组的切片值进行修改,不会改变原有数组值。

示例如下:

Go 复制代码
cityCopy[0] = "呼和浩特"
fmt.Println("cityCopy:", cityCopy)
fmt.Println("citys:", citys)

总结

本文内容为Go语言中切片(slice)概念、定义、特性及使用示例。

相关推荐
疯一样的码农5 分钟前
Python 正则表达式(RegEx)
开发语言·python·正则表达式
代码之光_19806 分钟前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi12 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
疯狂的程需猿17 分钟前
一个百度、必应搜索引擎图片获取下载的工具包
golang·图搜索
&岁月不待人&27 分钟前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove31 分钟前
G1垃圾回收器日志详解
java·开发语言
无尽的大道39 分钟前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒42 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
binishuaio1 小时前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE1 小时前
【Java SE】StringBuffer
java·开发语言