Go语言 切片slice

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

目录

切片(slice)

定义切片

不设置长度

追加数据

长度与容量

基于数组创建切片

常用切片方式

修改值

总结


切片(slice)

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

定义切片

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

示例如下:

package main

import "fmt"

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

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

不设置长度

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

示例如下:

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

 

追加数据

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

示例如下:

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

运行结果:

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

长度与容量

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

示例如下:

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

运行结果:

长度: 1 ,容量: 1
长度: 2 ,容量: 2
长度: 3 ,容量: 4
长度: 4 ,容量: 4
长度: 5 ,容量: 8
长度: 6 ,容量: 8
长度: 7 ,容量: 8
长度: 8 ,容量: 8
长度: 9 ,容量: 16
长度: 10 ,容量: 16

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

len获取长度,cap获取容量

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

基于数组创建切片

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

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

示例如下:

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)
}

运行结果:

新数组city1: [北京 天津 上海]
切片city2: [北京 天津 上海]
[北京 天津 上海]
[北京1 天津 上海]

 

常用切片方式

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

示例如下:

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

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

示例如下:

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

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

示例如下:

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

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

示例如下:

str1 := "helloWorld"[3:5]
fmt.Println(str1) // lo

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

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

示例如下:

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

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

示例如下:

cityCopy := make([]string, len(citys))
copy(cityCopy, citys[:])
fmt.Println(cityCopy)

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

修改值

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

示例如下:

cityCopy[0] = "呼和浩特"
fmt.Println("cityCopy:", cityCopy)
fmt.Println("citys:", citys)

总结

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

你可能感兴趣的:(GO,golang,开发语言,后端)