文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、切片是什么?
- Go语言中的数组,数组的长度一旦确定就不能改变, 但在实际开发中我们
可能事先不能确定数组的长度, 为了解决这类问题Go语言中推出了一种新的数据类型 切片 - 切片可以简单的理解为长度可以变化的数组,但是Go语言中的切片本质上是一个结构体
二、切片的三种创建方式
1.1、通过数组创建切片 array[startIndex.endIndex]
- 切片取值顾头步顾尾
arrMondayOne := []string{"老王", "你是哪个", "我住在你隔壁", "我姓王"}
arrMonday := arr[1:3] //[你是哪个 我住在你隔壁] ,和python一样顾头不顾尾
fmt.Println(arrMonday)
---------
var arr = [5]int{1, 2, 3, 4, 5}
var sex = arr[2:4]
fmt.Println(sex) // [3 4]
fmt.Println(len(sex)) // 2
fmt.Println(cap(sex)) //3, cap可以用来查看数组或slice的容量
- 指定起始位置时有三种方式可以指定
- 开始位置和结束位置都指定
- 只指定开始位置或结束位置
- 开始位置和结束位置都不指定
var arr = [5]int{1, 2, 3, 4, 5}
// 同时指定开始位置和结束位置
var sec = arr[2:4]
fmt.Println(sec) // [3 4]
// 只指定结束位置
secMonday := arr[:5]
fmt.Println(secMonday) //[1 2 3 4 5]
// 只指定开始位置
secTuesday := arr[2:]
fmt.Println(secTuesday) //[3 4 5]
// 都不指定, 就是打印所有
secWednesday := arr[:]
fmt.Println(secWednesday) // [1 2 3 4 5]
1.2、方式二: 通过make函数创建 make(类型, 长度, 容量)
- 内部会先创建一个数组, 然后让切片指向数组
- 如果没有指定容量,那么容量和长度一样
- make() , 第一个参数: 指定切片数据类型 ,第二个参数: 指定切片的长度,第三个参数: 指定切片的容量
var sec = make([]int, 3, 5)
fmt.Println(sec) // [0 0 0]
fmt.Println(len(sec)) // 3
fmt.Println(cap(sec)) //5
/*
内部的实现原理
var arr =[5]int{0,0,0}
var sec =arr[0:3]
*/
1.3、通过Go提供的语法糖快速创建
- 和创建数组一样但是不能指定长度
- 通过该方式创建时,切片的长度和容量相等
var sce = []int{1, 3, 5}
fmt.Println(sce) // [1 3 5]
fmt.Println(len(sce)) // 3
fmt.Println(cap(sce)) // 3
二、切片的使用
- 切片的基本使用方式和数组一样, 可以通过 切片名称[索引] 方式操作切片
var sec = []int{1, 3, 5}
sec[1] = 666
fmt.Println(sec) //[1 666 5]
// 使用切片的时候不可以下标越界
- 如果希望切片自动扩容,那么添加数据时必须使用append方法
- append函数会在切片 末尾 添加一个元素, 并返回一个追加数据之后的切片
- 利用append函数追加数据时,如果追加之后没有超出切片的容量,那么返回原来的切片, 如
果追加之后超出了切片的容量,那么返回一个新的切片 - append函数每次给切片扩容都会按照原有切片容量*2的方式扩容
package main
import "fmt"
func main() {
var sce = []int{1, 3, 5}
fmt.Println("追加数据前:", sce) // [1 3 5]
fmt.Println("追加数据前:", len(sce)) // 3
fmt.Println("追加数据前:", cap(sce)) // 3
fmt.Printf("追加数据前: %p\n", sce) // 0xc0420600a0
// 第一个参数: 需要把数据追加到哪个切片中
// 第二个参数: 需要追加的数据, 可以是一个或多个
sce = append(sce, 666)
fmt.Println("追加数据后:", sce) // [1 3 5 666]
fmt.Println("追加数据后:", len(sce)) // 4
fmt.Println("追加数据后:", cap(sce)) // 6
fmt.Printf("追加数据前: %p\n", sce) // 0xc042076b60
练习
one:编写一个函数,将字符串的每个字母放入一个数组中,并返回该数组
//方式一
func arrStrone(strone string) []string {
var arrstrone []string
for i := 0; i < len(strone); i++ {
arrstrone = append(arrstrone, string(strone[i])) // arrstrone 是一个字符串切片,而 strone[i] 是一个单个字符,这两者的类型不匹配。要修复这个问题,你需要将单个字符转换为字符串,然后再将其添加到切片中
}
return arrstrone
}
// 方式二
func arrStrtwo(str string) [] string {
var arrstrone [] string
for _,char := range str{
arrstrone = append(arrstrone, string(char))
}
return arrstrone
}