1、切片
切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用类型的机制
切片的使用和数组类似,如遍历切片,访问切片的元素和求切片长度len(slice)都一样。
切片的长度是可以变化的,因此切片是一个可以动态变化的数组
2、切片的定义
1 2 | var 切片名 []类型 比如: var a []int |
3、切片的使用
3.1 通过引用一个已声明好的数组
1 2 3 4 | func main() { intArr := [...]int{0, 1, 2, 3, 4, 5, 6} slice := intArr[1:6] } |
slice是一个切片
intArr[1:6]表示引用到intArr这个数组
引用intArr数组的起始下标为1,最后的下标为3(但是不包含3)
3.2 通过make来创建切片
基本语法:var 切片名 []type = make([]type,len,cap)
参数说明:type就是数据类型,len为长度,cap为容量(可选),cap不小于len
1 2 3 4 5 6 | func main() { var slice []int = make([]int, 5, 10) // slice必须make后才能使用 slice[0] = 1 slice[4] = 9 } |
通过make方式创建切片可以指定切片的大小和容量
如果没有给切片的各个元素赋值,那么就会使用默认值,
通过make方式创建的切片对应的数组,是由make底层维护,对外不可见,即只能通过slice去访问各个元素
3.3 直接指定具体数组,使用原理类似make方式
1 2 3 | func main() { var slice []string = []string{ "jake" , "tom" , "marry" } } |
3.4 切片可以继续切片
1 2 3 4 | func main() { var slice []string = []string{ "jake" , "tom" , "marry" } slice2 := slice[1:3] } |
3.5 用append内置函数,可以对切片进行动态追加
1 2 3 4 5 6 7 8 9 | func main() { var slice []string = []string{ "jake" , "tom" , "marry" } slice = append(slice, "Lucy" , "Lily" ) fmt.Printf( "slice追加后=%v\n" , slice) var slice2 []string = []string{ "jake" , "tom" , "marry" } // 可以追加切片 slice = append(slice, slice2...) fmt.Printf( "slice追加切片slice2后=%v\n" , slice) } |
输出:
1 2 | slice追加后=[jake tom marry Lucy Lily] slice追加切片slice2后=[jake tom marry Lucy Lily jake tom marry] |
切片append操作的原理分析:
a. go底层会创建一个新的数组newArr(安装扩容后大小)
b. 将slice原来包含的元素拷贝到新的数组newArr
c. slice重新引用到newArr
注意newArr是底层来维护的,程序员不可见。
3.6 使用copy内置函数来实现切片的拷贝操作
1 2 3 4 5 6 | func main() { var slice []int = []int{1, 2, 3, 4, 5} slice2 := make([]int, 10) copy(slice2, slice) fmt.Printf( "slice2=%v\n" , slice2) } |
4、string和slice
string底层是一个byte数组,本身是引用这个byte数组的切片 ,因此string也可以进行切片处理
1 2 3 4 5 | func main() { str := "www.baidu.com" slice := str[10:] fmt.Printf( "slice=%v\n" , slice) } |
string是不可变的,也就是说不能通过str[0]='z'方式来修改字符串
如果需要修改字符串,可以先将string->[]byte或者[]rune->修改后重新转成string
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!