总结go语言中切片的使用

本文详细介绍了Go语言中切片的四种创建方式,包括直接定义、使用`make`、数组转换和使用`new`。讨论了切片的现状,如长度为0的切片如何添加元素、切片的引用特性及其在`append`操作中的表现。同时,阐述了切片的常用方法,如获取长度和容量、遍历、添加元素和删除元素。最后,通过示例展示了切片的扩容机制,分析了其容量增长的规律。
摘要由CSDN通过智能技术生成

一、创建切片的几种方式

  • 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的来添加容量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水痕01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值