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)概念、定义、特性及使用示例。

相关推荐
上进小菜猪3 小时前
把 KES 集群交给 Kubernetes 的九十天:一个 DBA 的试用实录
后端
两点王爷3 小时前
PostgreSQL 常用 SQL 语句与 GIS 相关函数详解
数据库·后端
考虑考虑4 小时前
Springboot环境变量占位符语法
spring boot·后端·spring
C++ 老炮儿的技术栈4 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
传奇开心果编程5 小时前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
zr想努力5 小时前
从0开始配置Perforce4环境
开发语言
步行cgn6 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
幸运小圣6 小时前
PointerEvent 常用属性与事件整理【JavaScript】
开发语言·javascript·ecmascript
长谷深风1117 小时前
评测AI Agent:三种裁判各司其职
java·大数据·开发语言·人工智能·ai agent
边境悍匪7 小时前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring