总结go语言中切片的使用

一、创建切片的几种方式

  • 1、直接定义

    var slice1 []int = []int{1,2,3,4}
    var slice2 = []string{"张三", "李四"}
    slice3 :=[]bool{true, false}
    复制代码
  • 2、使用make函数来创建

    // 使用make定义的时候可以传递三个参数,
    // 第一个是切片的数据类型
    // 第二个参数是切片的长度
    // 第三个参数是切片的容量 可选的如果不写默认和长度一样的
    var slice1 = make([]int,2)
    复制代码
  • 3、数组转换为切片

    numAry := [10]int{0,1,2,3,4,5,6,7,8,9}
    // 这样切片是全部切,切片和python中一样的左闭右开的原则
    slice1 := numAry[:]
    fmt.Printf("%T-%T",numAry, slice1)
    复制代码
  • 4、使用new函数来创建

    slice1 := new([]int)
    fmt.Printf("%T", slice1)
    复制代码

二、切片的几个现状

  • 1、使用make声明切片的时候如果长度没有是不能拷贝数据进去的,有几个长度就能拷贝几个元素进去

    a := make([]int,0)
    b := []int{1,2,3,4}
    // 将b中的数据拷贝到a中
    copy(a,b)
    fmt.Println(a,b)
    复制代码
  • 2、长度为0的切片使用append却可以添加进去元素,因为切片的自动扩容机制所致

    a := make([]int,0)
    a = append(a, 10)
    fmt.Println(a)
    复制代码
  • 3、切片是地址引用的方式

    b := []int{1,2,3,4}
    // 快速的拷贝一份副本
    c := b[:]
    c[0] = 10
    // 这里b和c都会被修改
    fmt.Println(b,c)
    复制代码
  • 4、在3的基础上使用append的时候却不会相互影响

    b := []int{1,2,3,4}
    // 快速的拷贝一份副本
    c := b[:]
    c[0] = 10
    fmt.Println(b,c)
    c = append(c, 20)
    fmt.Println(b,c)
    复制代码

    原因使用append开始的切片容量不够的时候,就会自动扩容,扩容后就是一个新的切片地址了,因为切片的底层也是一个数组

    package main
    
    import "fmt"
    
    func main() {
    	b := []int{1,2,3,4}
    	// 快速的拷贝一份副本
    	c := b[:]
    	c[0] = 10
    	fmt.Println(b,c)
    	fmt.Printf("开始b切片:%d-%d\n", len(b), cap(b))
    	fmt.Printf("开始c切片:%d-%d\n", len(c), cap(c))
    	c = append(c, 20)
    	fmt.Println(b,c)
    	fmt.Printf("结束的b切片:%d-%d\n", len(b), cap(b))
    	fmt.Printf("结束的c切片:%d-%d\n", len(c), cap(c))
    }
    复制代码

三、切片常见的方法

  • 1、长度和容量

  • 2、切片的遍历

    package main
    
    import "fmt"
    
    func main() {
    	b := []int{1,2,3,4,5,6,7,8,9}
    	for index, value := range b {
    		fmt.Println(index, value)
    	}
    }
    复制代码
  • 3、使用append添加元素

    package main
    
    import "fmt"
    
    func main() {
    	b := []int{1,2,3,4}
    	c := []int{5,6,7,8,9}
    	// 直接添加一个元素
    	c = append(c,0,20)
    	// 添加一个切片要用...展开运算符
    	c = append(c, b...)
    	fmt.Println(c)
    }
    复制代码
  • 4、删除一个元素

    package main
    
    import "fmt"
    
    func main() {
    	c := []int{5,6,7,8,9}
    	d := make([]int,0)
    	d = append(c[:2], c[3:]...)
    	fmt.Println(d)
    }
    复制代码

四、切片的扩容机制

  • 1、演示代码

    package main
    
    import "fmt"
    
    func main() {
    	a := make([]int, 0)
    	fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a))
    	a = append(a,1)
    	fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a))
    	a = append(a,2)
    	fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a))
    	a = append(a,3)
    	fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a))
    	a = append(a,4)
    	fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a))
    	a = append(a,5)
    	fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a))
    	a = append(a,6)
    	fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a))
    	a = append(a,7)
    	fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a))
    	a = append(a,8)
    	fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a))
    	a = append(a,9)
    	fmt.Printf("当前切片的长度:%d,容量:%d\n", len(a), cap(a))
    }
    复制代码
  • 2、运行结果

    当前切片的长度:0,容量:0
    当前切片的长度:1,容量:1
    当前切片的长度:2,容量:2
    当前切片的长度:3,容量:4
    当前切片的长度:4,容量:4
    当前切片的长度:5,容量:8
    当前切片的长度:6,容量:8
    当前切片的长度:7,容量:8
    当前切片的长度:8,容量:8
    当前切片的长度:9,容量:16
    复制代码
  • 3、总结

    • 如果容量小于1024的时候,是成倍数的添加容量
    • 如果容量大于1024的时候,是之前的1/4的来添加容量
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享