• Go语言学习(六)切片


    切片的引入

    在这里插入图片描述

    切片的语法: var 切片名 []类型 = 数组的一个片段引用

    切片的内存分析

    切片有3个字段的数据结构:一个是指向底层数组的指针,一个是切片的长度,一个是切片的容量
    代码:
    在这里插入图片描述
    内存:
    在这里插入图片描述

    切片的定义

    方式1:定义一个切片,然后让切片去引用一个已经创建好的数组
    在这里插入图片描述方式2:通过make内置函数来创建切片。基本语法:var切片名[type = make([], len, [cap])]
    在这里插入图片描述
    make底层创建一个数组,对外不可见,所以不可以直接操作这个数组,要通过slice去间接的访问各个元素,不可以直接对数组进行维护/操作

    方式3:定义一个切片,直接就指定具体数组,使用原理类似make的方式

    在这里插入图片描述

    切片的遍历

    package main
    import "fmt"
    
    func main() {
    	slice := make([]int, 4, 20)
    	slice[0] = 66
    	slice[1] = 88
    	slice[2] = 99
    	slice[3] = 100
    	//方式1:普通for循环
    	for i := 0; i < len(slice); i++ {
    		fmt.Printf("slice[%v] = %v \t", i, slice[i])
    	}
    	fmt.Println("-------------------------")
    	//方式2:for-range循环
    	for i, v := range slice {
    		fmt.Printf("下标:%v, 元素: %v\t", i, v)
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    切片的注意事项

    1. 切片定义后不可以直接使用,需要让其引用到一个数组,或者make一个空间供切片来使用
      在这里插入图片描述
    2. 切片的使用不能越界
      在这里插入图片描述
    3. 简写方式:

    var slice = arr[0:end] ==> var slice = arr[:end]
    var slice = arr[start:len(arr)] ==> var slice = arr[start:]
    var slice = arr[0:len(arr)] ==> var slice = arr[:]

    1. 切片可以继续切片
      在这里插入图片描述
    2. 切片可以动态增长
    package main
    import "fmt"
    
    func main() {
    	var intarr [6]int = [6]int{1, 2, 3, 4, 5, 6}
    	var slice []int = intarr[1:4]
    	fmt.Println(len(slice))
    
    	slice2 := append(slice, 88, 99)
    	fmt.Println(slice2)
    	//底层原理
    	//1. 底层追加元素的时候对数组进行扩容,老数组扩容为新数组
    	//2. 创建一个新数组,将老数组中的2,3,4复制到新数组中,在新数组中追加88,99
    	//3. slice2 底层数组的指向 指向的是新数组
    	//4. 往往我们在使用追加的时候其实想要做的效果给slice追加
    	slice = append(slice, 666, 777)
    	fmt.Println(slice)
    	//5. 底层的新数组 不能直接维护 需要通过切片间接维护操作
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    通过append函数将切片追加给切片
    在这里插入图片描述
    6. 切片的拷贝

    package main
    import "fmt"
    func main() {
    	var a []int = []int{1, 2, 3, 4, 5, 6}
    	var b []int = make([]int, 10)
    	//拷贝
    	copy(b, a) //将a中内容复制到b中
    	fmt.Println(b)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    MySQL 中分区表
    算法训练Day30 回溯算法专题 | LeetCode332. 重新安排行程;51.N皇后(棋盘问题);37.解数独(二维的递归)
    如何在 Ubuntu 上部署 ONLYOFFICE 协作空间社区版?
    java毕业设计艾灸减肥管理网站Mybatis+系统+数据库+调试部署
    05_利用神经网实现MINST手写数字识别
    StartDT奇点云通过CMMI5全球软件领域最高级别成熟度认证
    java.lang.Enum类下compareTo()方法起什么作用呢?
    半导体动态杂谈
    软件设计模式总结
    Centos7-Failed to start LSB: Bring up/down networking
  • 原文地址:https://blog.csdn.net/qq_57469718/article/details/127735661