小白教程

 找回密码
 立即注册

Go语言基础之切片

发布者: 小白教程

简单介绍

切片slice的底层数据是数组,slice是对数组的封装,它描述一个数组的片段。两者都可以通过下标来访问单个元素。 数组是定长的,长度定义好之后,不能再更改。而切片则非常灵活,它可以动态地扩容。切片的类型和长度无关。 数组就是一片连续的内存,slice 实际上是一个结构体,包含三个字段:长度、容量、底层数组。切片的数据结构如下图:

// runtime/slice.go
type slice struct {
    array unsafe.Pointer // 元素指针,指向一个数组的指针
    len   int // 当前切片的长度
    cap   int // 当前切片的容量
} 
复制
1
2
3
4
5
6

go切片结构

#1 概述

  • 切片是围绕动态数组概念构建的。但是切片本身并不是动态数组,而是对底层数组的抽象。
  • 按需自动改变大小
  • 与数组相比,切片的长度可以在运行时修改
  • 切片不存具体的值,切片是一个引用类型
  • 相当于java中的ArrayList

#2 引子

因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性。 例如:

func arraySum(x [3]int) int{
    sum := 0
    for _, v := range x{
        sum = sum + v
    }
    return sum
}
复制
1
2
3
4
5
6
7

这个求和函数只能接受[3]int类型,其他的都不支持。 再比如,

a := [3]int{1, 2, 3}

数组a中已经有三个元素了,我们不能再继续往数组a中添加新元素了。

#3 切片的定义

声明切片类型的基本语法

var name []T

name:表示变量名 T:表示切片中的元素类型,举例如下:

func main() {
	// 声明切片类型
	var a []string              //声明一个字符串切片
	var b = []int{}             //声明一个整型切片并初始化
	var c = []bool{false, true} //声明一个布尔切片并初始化
	var d = []bool{false, true} //声明一个布尔切片并初始化
	fmt.Println(a)              //[]
	fmt.Println(b)              //[]
	fmt.Println(c)              //[false true]
	fmt.Println(a == nil)       //true
	fmt.Println(b == nil)       //false
	fmt.Println(c == nil)       //false
	// fmt.Println(c == d)   //切片是引用类型,不支持直接比较,只能和nil比较
}
复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14

切片的长度和容量

切片拥有自己的长度和容量,我们可以通过使用内置的len()函数求长度,使用内置的cap()函数求切片的容量。

#4 基于数组定义切片

#由于切片的底层就是一个数组,所以我们可以基于数组定义切片。

func main() {
	// 基于数组定义切片
	a := [5]int{55, 56, 57, 58, 59}
	b := a[1:4]                     //基于数组a创建切片,包括元素a[1],a[2],a[3]
	fmt.Println(b)                  //[56 57 58]
	fmt.Printf("type of b:%T\n", b) //type of b:[]int
}
复制
1
2
3
4
5
6
7

#还支持如下方式:

c := a[1:] //[56 57 58 59]
d := a[:4] //[55 56 57 58]
e := a[:]  //[55 56 57 58 59]
复制
1
2
3

#

1234下一页
上一篇:Go语言数组
Go语言教程

Archiver|手机版|小黑屋|小白教程 ( 粤ICP备20019910号 )

GMT+8, 2024-9-20 01:48 , Processed in 0.018811 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

返回顶部