第 10 節:複合型別 2: 切片

kuibatian發表於2019-12-03

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

相關文章