4.3. 第 2节:切片
2: 切片
07 切片定义和使用
切片:切片与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大,所以可以将切片理解成 “动态数组”,但是,它不是数组。
package main
import "fmt"
func main0801() {
//数组定义
//var 数据名 [元素个数]数据类型
//切片定义
//var 切片名 []数据类型
var slice []int = []int{1, 2, 3, 4, 5}
slice[0] = 123
slice[2] = 234
//在使用切片是不能超过切片的范围 下标越界
//slice[5] = 456 //err
//append 切片添加数据
slice = append(slice, 456)
slice = append(slice, 7, 8, 9)
fmt.Println(slice)
//len(切片名)计算切片的长度
for i := 0; i < len(slice); i++ {
fmt.Println(slice[i])
}
//for i,v:=range slice{
// fmt.Println(i,v)
//}
}
func main() {
//切片赋值
//var slice []int
//slice[0]=123//err切片下标越界
//slice = append(slice, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
//在定义切片时可以指定长度 make(切片类型,长度)
//var slice []int=make([]int,10)
//
//slice[0]=123
//slice[1]=234
//slice = append(slice, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
//通过自动推到类型创建切片
slice :=[]int{1,2,3}
fmt.Println(slice)
fmt.Println(len(slice))
}
08 切片的地址和扩容
package main
import "fmt"
func main0901() {
//切片名本身就是一个地址
//创建的空切片 指向内存地址编号为0的空间
var slice []int
fmt.Printf("%p\n", slice)
//当使用append进行追加数据时 切片地址可能会发生改变
slice = append(slice, 1, 2, 3)
fmt.Printf("%p\n", slice)
slice = append(slice, 4, 5, 6)
fmt.Printf("%p\n", slice)
}
func main0902() {
//var slice []int =make([]int,10)
//make(数据类型,长度,容量)
slice := make([]int, 10, 20)
//在使用appned进行数据添加时 如果长度超出容量 容量会自动扩容
//一般扩容方式为上一次 容量*2 如果超过1024字节 每次扩容上一次的1/4
//容量扩容每次都是偶数
//len(slice) 计算切片的长度
//cap(slice) 计算切片的容量
fmt.Println(cap(slice))
fmt.Printf("%p\n", slice)
fmt.Println(slice)
slice = append(slice, 1, 2, 3, 4, 5)
fmt.Println(cap(slice))
fmt.Printf("%p\n", slice)
fmt.Println(slice)
slice = append(slice, 1, 2, 3, 4, 5, 6)
fmt.Println(cap(slice))
fmt.Printf("%p\n", slice)
fmt.Println(slice)
}
func main() {
slice := []int{1, 2, 3, 4, 5}
fmt.Println("长度", len(slice))
fmt.Println("容量", cap(slice))
slice = append(slice, 1)
fmt.Println("长度", len(slice))
fmt.Println("容量", cap(slice))
//使用len(slice)来打印数据 不能使用cap(slice)
//for i := 0; i < cap(slice); i++ {
// fmt.Println(slice[i])
//}
}
9 切片的截取
package main
import "fmt"
func main1001() {
slice :=[]int{1,2,3,4,5,6,7,8,9,10}
//切片名[起始位置:结束位置+1] 切片名[low:high]
//s:=slice[3:7]
//容量=max-low
//切片名[起始位置:结束位置+1:容量] 切片名[low:high:max]
//s:=slice[3:7:7]
//切片名[起始位置:] 从起始位置打结束
//s:=slice[2:]
//切片名[:结束位置+1]
//s:=slice[:5]
//s:=slice[:]
s:=slice
fmt.Println(s)
//容量要大于等于长度
//fmt.Println(len(s))
//fmt.Println(cap(s))
}
func main(){
slice :=[]int{1,2,3,4,5,6,7,8,9,10}
//截取后的切片还是原始切片中的一块内容 如果修改截取后的切片 影响原始切片的值
//s:=slice[2:5]
s:=slice[:]
s[1]=123//3 123 5
fmt.Println(s)
fmt.Println(slice)
fmt.Printf("%p\n",slice)
fmt.Printf("%p\n",s)
}
10 切片的拷贝
package main
import "fmt"
func main() {
var slice []int = []int{1, 2, 3, 4, 5}
s := make([]int, 5)
//使用copy进行拷贝 在内存中存储两个独立的切片内容 如果任意一个发生修改不会影响另外一个
copy(s, slice)
fmt.Println(s)
fmt.Printf("%p\n",slice)
fmt.Printf("%p\n",s)
//s[2]=123
//fmt.Println(s)
//fmt.Println(slice)
//
//
//slice =append(slice,6,7,8)
//fmt.Println(s)
//fmt.Println(slice)
}
11 切片的排序
package main
import "fmt"
func main() {
var slice []int = []int{9, 1, 5, 6, 8, 3, 7, 2, 10, 4}
for i := 0; i < len(slice)-1; i++ {
for j := 0; j < len(slice)-1-i; j++ {
if slice[j] > slice[j+1] {
slice[j], slice[j+1] = slice[j+1], slice[j]
}
}
}
fmt.Println(slice)
}