本文内容为Go语言中切片(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)概念、定义、特性及使用示例。