第 10 节:复合类型 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)
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
嗨,我是波波。曾经创业,有收获也有损失。我积累了丰富教学与编程经验,期待和你互动和进步! 公众号:上海PHP自学中心 付费知识星球:破解面试:程序员的求职导师
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
司机 @ 欣昊玉
文章
273
粉丝
339
喜欢
558
收藏
1106
排名:64
访问:12.2 万
私信
所有博文
社区赞助商