美文网首页
Golang——切片slice

Golang——切片slice

作者: Cici冬雪 | 来源:发表于2020-05-21 21:41 被阅读0次

切片是一个拥有相同类型元素可变长度的序列,底层基于数组类型进行封装。
切片是一个引用类型,内部结构包括地址(切片中第一元素的指向的内存空间)、大小(切片中目前元素的个数)和容量(底层数组最大能存放的元素个数),必须初始化才能使用

值类型,整型、浮点型、布尔型、字符串、数组,声明时就有初始值。
引用类型,声明时候的初始值是nil。nil在内存中是没有位置。

var 变量名 []变量类型

切片使用

func main() {
    // 直接声明使用
    var a = []int{1, 2, 3}
    fmt.Println(a)             //[1 2 3]
    fmt.Println(a[1])          //2    
    fmt.Printf("a:%T\n", a)    //a:[]int

    //从数组中得到切片
    var b = [10]int{1, 2, 3, 4, 5}
    var c = b[1:6]
    fmt.Println(c)              // [2 3 4 5 0]

    //切片大小(目前元素的梳理)
    fmt.Printf("切片大小:%d\n", len(c))  //5
    //切片容量(底层数据组最大能放多少元素)
    fmt.Printf("切片容量:%d\n", cap(c))  //9

    //切片再切片,不可超容量
    var d = c[1:6]
    fmt.Println(d)  
} 
image.png

切片扩容

func main() {
    //切片扩容,扩容策略,在旧切片在小于1024情况下,每一次都是上一次的2倍
    var e = []int{}
    fmt.Println(e, len(e), cap(e))       //[] 0 0

    e = append(e, 1)
    fmt.Println(e, len(e), cap(e))       //[1] 1 1

    e = append(e, 1)
    fmt.Println(e, len(e), cap(e))       //[1 1] 2 2 

    e = append(e, 1)
    fmt.Println(e, len(e), cap(e))       //[1 1 1] 3 4

    e = append(e, 1)
    fmt.Println(e, len(e), cap(e))       //[1 1 1 1] 4 4

} 

注意:
(1)切片支持 自动扩容,在旧切片在小于1024情况下,扩容策略每一次都是上一次的2倍(扩容策略源码在$GOROOT/src/runtime/slice.go)。不建议切片自动扩容,建议申请内存时候就确定容量大小
(2)append()是内置函数,往切片中追加元素。append函数必须需要变量接收返回。
slice = append(slice, e)

切片是引用类型

func main() {
    //验证切片是引用类型
    var a = []int{1, 2, 3}
    fmt.Println(a)              //[1 2 3]
    b := a
    b[0] = 11
    fmt.Println(a)              //[11 2 3]
    fmt.Println(b)              //[11 2 3]
} 

切片复制copy函数

func main() {
    var a = []int{1, 2, 3}
    //切片复制copy
    // var c []int  //未申请内存
    // c = make([]int, 3, 3)  //申请内存

    //或者声明初始化,也申请内存
    c := []int{0, 0, 0}

    count := copy(c, a)
    fmt.Println(count)           //3 
    fmt.Println(c)               //[11 2 3]

    c[1] = 22
    fmt.Println(c)               //[11 22 3]
    fmt.Println(a)               //[11 2 3]
} 

切片中元素删除
append函数中,...把切片中拆成一个一个元素

func main() {
    //从切片中删除元素
    d := []int{1, 2, 3, 4, 5}
    fmt.Println(d)               //[1 2 3 4 5]
    //...把切片中拆成一个一个元素
    d = append(d[:1], d[2:]...)
    fmt.Println(d)               //[1 3 4 5]
} 

切片不能直接比较,只能和nil比较。一个nil值切片底层没有数组,nil值切片长度0。

func main(){

    //只声明
    var a []int
    fmt.Println(a, len(a), cap(a))   //[] 0 0
    if a == nil {
        fmt.Println("a is nil")      //a is nil
    }

    //声明并且初始化
    b := []int{}
    fmt.Println(b, len(b), cap(b))   //[] 0 0
    if b == nil {
        fmt.Println("b is nil")      
    }

    c := make([]int, 0)              //[] 0 0
    fmt.Println(c, len(c), cap(c)) 
    if c == nil {
        fmt.Println("c is nil")      
    }

    //判断切片是否空,不能用nil,需要用len函数
    if len(a)  == 0 {
        fmt.Println("a 是空切片") 
    }
    if len(b)  == 0 {
        fmt.Println("b 是空切片") 
    }
    if len(c)  == 0 {
        fmt.Println("c 是空切片") 
    }
}

切片遍历

func main() {
    // 直接声明使用
    var a = []int{1, 2, 3}
    fmt.Println(a)          
    
    for i := 0; i < len(a); i++ {
        fmt.Printf("a[%d]=%d\n", i, a[i])
    }

    for index, value := range a {
        fmt.Printf("a[%d]=%d\n", index, value)
    }

}

相关文章

  • Go-Slice

    golang 切片(Slice) 切片为引用类型,切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基...

  • Learn Golang in 21 Days - Day 10

    Learn Golang in 21 Days - Day 10 知识点 切片Slice Slice是对数组的抽象...

  • golang:slice切片

    golang中的切片的索引是左闭右开的,切片不存储数据,它是对数组的引用,其他切片可以跟它共享同一个底层的数组,所...

  • Golang——切片slice

    切片是一个拥有相同类型元素的可变长度的序列,底层基于数组类型进行封装。切片是一个引用类型,内部结构包括地址(切片中...

  • Golang 中的数组 (array) 和切片 (slice)

    huangwenwei - 字里行间 | Golang 中的数组 (array) 和切片 (slice) 中文描述...

  • Golang 入门 : 切片(slice)

    切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合。切片是围绕动态...

  • Golang 入门 : 切片(slice)

    切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合。切片是围绕动态...

  • Go 学习之路:引用类型与值类型

    Golang中只有三种引用类型:slice(切片)、map(字典)、channel(管道); 引用类型 引用类型理...

  • Go 学习:引用类型与值类型

    Golang中只有三种引用类型:slice(切片)、map(字典)、channel(管道); 引用类型 引用类型理...

  • golang-slice

    最近在使用golang进行开发,使用slice的时候遇到了一些坑 slice:用来弥补数组的不足,称之为数组切片 ...

网友评论

      本文标题:Golang——切片slice

      本文链接:https://www.haomeiwen.com/subject/xxvlohtx.html