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