切片
什么是切片
- 切片长度不固定,不设定长度
- 内置数据类型
- 三元素:
- 指针 slice 指定的开始位置
- 长度 slice 的长度
- 容量 slice 开始到最后的最大长度
package main
import "fmt"
func main() {
slice01 := []int{}
fmt.Printf("%T\n", slice01)
fmt.Println("默认切片:", slice01)
fmt.Println("切片长度:", len(slice01))
fmt.Println("切片容量:", cap(slice01))
var slice02 []int
if slice02 == nil {
fmt.Println(slice02 == nil)
fmt.Println("切片空", slice02)
}
slice03 := []int{1, 2, 3, 4}
fmt.Println("slice03有值切片:", slice03)
fmt.Printf("%T\n", slice03)
fmt.Println("slice03切片长度:", len(slice03))
fmt.Println("slice03切片容量:", cap(slice03))
}
make 定义切片
package main
import "fmt"
func main() {
slice004 := make([]int, 5, 10)
fmt.Printf("slice004切片数据:%T\n", slice004)
fmt.Printf("slice004切片长度:%d\n", len(slice004))
fmt.Printf("slice004切片容量:%d\n", cap(slice004))
slice004 = append(slice004, 7, 1)
fmt.Println(slice004)
slice004 = append(slice004, 7, 1, 2, 37, 1, 2, 37, 1, 2, 37, 1, 2, 37, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6)
slice004 = append(slice004, 7, 1, 2, 37, 1, 2, 37, 1, 2, 37, 1, 2, 37, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6)
fmt.Println("扩容后的slice004:", slice004)
fmt.Printf("扩容后slice004切片数据:%T\n", slice004)
fmt.Printf("扩容后slice004切片长度:%d\n", len(slice004))
fmt.Printf("扩容后slice004切片容量:%d\n", cap(slice004))
}
切片追加
package main
import "fmt"
func main() {
slice05 := make([]int, 0, 3)
slice06 := []int{1, 2, 3, 4, 5, 6}
slice05 = append(slice05, slice06...)
fmt.Println("slice05:", slice05)
}
遍历切片
package main
import "fmt"
func main() {
ergodicSlice1 := []int{1, 2, 3, 4}
for i := 0; i < len(ergodicSlice1); i++ {
fmt.Println(ergodicSlice1[i])
}
ergodicSlice2 := []int{1, 2, 3, 4}
for index, sliceVal := range ergodicSlice2 {
fmt.Println(index, sliceVal)
}
}
切片内存分析
- 切片 容量扩充/扩容内存 分析
- cap 成倍增加。容量超过1024,则按照1.2倍数增长
- 容量增加,内存地址就会发生变化
package main
import "fmt"
func main() {
sliceMemory := []int{1, 2, 3}
fmt.Printf("切片长度:%d 切片容量:%d\n", len(sliceMemory), cap(sliceMemory))
fmt.Printf("切片地址:%p\n", sliceMemory)
sliceMemory = append(sliceMemory, 1, 2)
fmt.Printf("切片长度:%d 切片容量:%d\n", len(sliceMemory), cap(sliceMemory))
fmt.Printf("切片地址:%p\n", sliceMemory)
sliceMemory = append(sliceMemory, 2, 3)
fmt.Printf("切片长度:%d 切片容量:%d\n", len(sliceMemory), cap(sliceMemory))
fmt.Printf("切片地址:%p\n", sliceMemory)
}
切片扩容
package main
import "fmt"
func main() {
sliceCopyBefore := []int{1, 2, 3}
fmt.Printf("原切片。长度:%d, 容量:%d\n", len(sliceCopyBefore), cap(sliceCopyBefore))
fmt.Printf("原切片内存地址:%p\n", sliceCopyBefore)
sliceCopyAfter := make([]int, cap(sliceCopyBefore)*2)
copy(sliceCopyAfter, sliceCopyBefore)
fmt.Printf("新切片。长度:%d, 容量:%d\n", len(sliceCopyAfter), cap(sliceCopyAfter))
fmt.Printf("新切片内存地址:%p\n", sliceCopyAfter)
}
数组的切片
package main
import "fmt"
func main() {
arraySlice := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
arraySlice01 := arraySlice[0:3]
arraySlice02 := arraySlice[:5]
arraySlice03 := arraySlice[2:5]
arraySlice04 := arraySlice[6:]
arraySlice05 := arraySlice[:10]
fmt.Printf("arraySlice01 数组切片后。长度:%d,容量:%d, 类型:%T, 内存地址:%p\n", len(arraySlice01), cap(arraySlice01), arraySlice01, arraySlice01)
fmt.Printf("arraySlice02 数组切片后。长度:%d,容量:%d, 类型:%T, 内存地址:%p\n", len(arraySlice02), cap(arraySlice02), arraySlice02, arraySlice02)
fmt.Printf("arraySlice03 数组切片后。长度:%d,容量:%d, 类型:%T, 内存地址:%p\n", len(arraySlice03), cap(arraySlice03), arraySlice03, arraySlice03)
fmt.Printf("arraySlice04 数组切片后。长度:%d,容量:%d, 类型:%T, 内存地址:%p\n", len(arraySlice04), cap(arraySlice04), arraySlice04, arraySlice04)
fmt.Printf("arraySlice04 最新截断的第一个元素的内存地址:%p\n", arraySlice04)
fmt.Printf("arraySlice 第6个元素的内存地址:%p\n", &arraySlice[6])
fmt.Printf("arraySlice05 数组切片后。长度:%d,容量:%d, 类型:%T, 内存地址:%p\n", len(arraySlice05), cap(arraySlice05), arraySlice05, arraySlice05)
fmt.Printf("arraySlice05 数组第一个元素 内存地址:%p\n", arraySlice05)
}
切片的类型
package main
import "fmt"
func main() {
array1 := [3]int{1, 2, 3}
array2 := array1
array1[2] = 100
fmt.Printf("array1:%v,array2:%v\n", array1, array2)
s1 := []int{1, 2, 3}
s2 := s1
s2[1] = 200
fmt.Printf("s1:%v,s2:%v\n", s1, s2)
}
切片如何实现深拷贝
- 使用make开辟新的切片
- 使用copy函数实现 切片深拷贝
package main
import "fmt"
func main() {
s3 := []int{1, 2, 3, 4, 5}
s4 := make([]int, 0)
for _, i := range s3 {
s4 = append(s4, i)
}
s4[3] = 100
fmt.Printf("s3:%p,s4:%p\n", s3, s4)
fmt.Printf("s3:%v,s4:%v\n", s3, s4)
s5 := []int{1, 1, 1, 1, 1, 1, 1, 1, 1}
copy(s5, s3)
fmt.Printf("s3:%p,s5:%p\n", s3, s5)
fmt.Printf("s3:%v,s5:%v\n", s3, s5)
s6 := []int{1, 1, 1, 1, 1, 1, 1, 1, 1}
copy(s3, s6)
fmt.Printf("s3:%p,s6:%p\n", s3, s6)
fmt.Printf("s3:%v,s6:%v\n", s3, s6)
}
数组和切片作为函数的参数
package main
import "fmt"
func updateSlice(s []int) {
fmt.Println("函数接收切片的值:", s)
s[2] = 100
fmt.Println("函数修改切片的值:", s)
}
func updateArray(a [3]int) {
fmt.Println("函数接收数组的值:", a)
a[2] = 100
fmt.Println("函数修改数组的值:", a)
}
func main() {
a1 := [3]int{1, 2, 3}
s1 := []int{1, 2, 3}
fmt.Println("切片传入函数前的值:", s1)
updateSlice(s1)
fmt.Println("切片传入函数后的值:", s1)
fmt.Println("-----------")
fmt.Println("数组传入函数前的值:", a1)
updateArray(a1)
fmt.Println("数组传入函数后的值:", a1)
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2019-07-02 Python进阶(十二)----re模块