【Go】十一、切片

1、切片

  • 引用数据类型
  • 对数组一个连续片段的引用
  • 终止索引那一项不包括在切片内

定义:

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

示例:

在这里插入图片描述

2、内存分析

切片有3个字段的数据结构:一个是指向底层数组的指针,一个是切片的长度,一个是切片的容量。且切片的第一个字段(指向底层数组的指针),值为所切数组片段的第一个元素的地址。

在这里插入图片描述

此外,切片为引用数据类型,有地址指向原数组,因此,可以直接改数组中的值:

slice[1] = 16

在这里插入图片描述

3、切片的定义

方式一:通过一个数组定义切片

在这里插入图片描述

方式二:通过内置函数make

var切片名[type = make([], len,[cap])

在这里插入图片描述
但通过make创建的切片,make底层创建一个数组,该数组对外不可见,不能直接操作这个数组,要通过切片去间接的访问或者操作。


方式三:直接指定具体的数据,原理类似make。注意格式上有点像数组,但[ ]中没有给长度,也没有...

在这里插入图片描述

4、切片的遍历

  • for
  • for range
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("\n------------------------------")
        //方式2:for-range循环:
        for i,v := range slice {
                fmt.Printf("下标:%v ,元素:%v\n" ,i,v)
        }
}

5、注意点

  • 切片定义后不可直接使用,需要让其引用到一个数组,或者使用make函数开一个空间给切片

在这里插入图片描述

  • 切片使用不能越界

在这里插入图片描述

  • 切片的简写
//从开始切到末尾某个索引
var slice = arr[0:end]  ----> var slice = arr[:end]

//从某个值切到末尾(注意这里len本来就比索引大1,所以即使左闭右开也取到末尾了)
var slice = arr[start:len(arr)]  ---->  var slice = arr[start:]

//全切
var slice = arr[0:len(arr)]   ----> var slice = arr[:]
  • 切片可以继续切片

在这里插入图片描述

  • 切片可以动态增长 ⇒ append函数
package main
import "fmt"
func main(){
        //定义数组:
        var intarr [6]int = [6]int{1,4,7,3,6,9}
        //定义切片:
        var slice []int = intarr[1:4] //4,7,3
        fmt.Println(len(slice))
        //给切片slice后面追加两个元素,并赋值给新切片slice2
        slice2 := append(slice,88,50)
        fmt.Println(slice2) //[4 7 3 88 50]
        fmt.Println(slice)	//4,7,3
        //底层原理:
        //1.底层追加元素的时候对数组进行扩容,老数组扩容为新数组:
        //2.创建一个新数组,将老数组中的4,7,3复制到新数组中,在新数组中追加88,50
        //3.slice2 底层数组的指向 指向的是新数组 
        //4.但往往我们在使用追加的时候其实想要做的效果给slice自身追加:
        slice = append(slice,88,50)
        fmt.Println(slice)
        //5.底层的新数组 不能直接维护,需要通过切片间接维护操作。
}
  • append函数将切片追加给切片
//定义数组:
var intarr [6]int = [6]int{1,4,7,3,6,9}
//定义切片:
var slice []int = intarr[1:4] //4,7,3
slice2 := []int{99,44}
slice = append(slice,slice3...)
fmt.Println(slice)	//4,7,3,99,44
  • copy函数切片的拷贝,注意下面拷贝完后,a、b两个切片底层对应的是两个数组,改值不会互相影响
package main
import "fmt"
func main(){
        //定义切片:
        var a []int = []int{1,4,7,3,6,9}
        //再定义一个切片:
        var b []int = make([]int,10)
        //拷贝:
        copy(b,a) //将a中对应数组中元素内容复制到b中对应的数组中
        fmt.Println(b)  //1 4 7 3 6 9 0 0 0 0 
}

相关推荐

  1. go自编自导自写一协成池

    2024-04-03 02:48:04       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-03 02:48:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-03 02:48:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-03 02:48:04       82 阅读
  4. Python语言-面向对象

    2024-04-03 02:48:04       91 阅读

热门阅读

  1. 模板方法模式

    2024-04-03 02:48:04       31 阅读
  2. 我的创作纪念日

    2024-04-03 02:48:04       31 阅读
  3. 2024.4.2

    2024-04-03 02:48:04       33 阅读
  4. 全球化智能组网产品优势

    2024-04-03 02:48:04       34 阅读
  5. pyqt5 无边框窗口拖动

    2024-04-03 02:48:04       33 阅读
  6. 前端开发语言有哪些

    2024-04-03 02:48:04       40 阅读
  7. Spring OAuth2 Resource Server 配置

    2024-04-03 02:48:04       41 阅读
  8. Spring-01

    Spring-01

    2024-04-03 02:48:04      24 阅读
  9. 【nosql-redis】关于持久化的补充

    2024-04-03 02:48:04       33 阅读
  10. 关于投标的细节

    2024-04-03 02:48:04       38 阅读
  11. Nginx 配置,自定义日志格式 log_format

    2024-04-03 02:48:04       42 阅读