开发者学堂课程【GO 语言核心编程-基础语法、数组、切片、Map:使用切片的三种方式】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/625/detail/9638
使用切片的三种方式
内容介绍:
一、 方式1
一、 方式二2
一、 方式三3
切片的使用
一、方式1
第一种方式:定义一个切片,然后让切片去引用一个已经创建好的数组,比如前面的案列就是这样的。
案例:
f
unc main() {
var arr [5]int = […]int{1,2,3,6,5}
//已经创建好的数组
v
ar slice = arr[1:3]
//使用 slice 引用已经创建好的数组
f
mt.Println(“arr=”,arr)
f
mt.Println(“slice=”,slice)
f
mt.Println(“slice len = ”, len(slice))
f
mt.Println(“slice cap = ”, cap(slice))
}
二.方式2
第二种方式:通过 make 来创建切片。 //使用内置函数直接创建切片
(1)基本语法:var 切片名[]type = make([]type,len,[cap])
(2)参数说明:type:就是数据类型 len:大小 cap:指定切片容量,可选
//如果分配了 cap,则要求 cap>=len,否则语法是错误的
(3)案例:
f
unc main() {
var slice []int = make([]int,4,10)
//切片的数据类型是[]中间不写任何数据,然后后面的 make 部分中有三个参数需要写,第一个参数是切片的类型,第二个参数是切片的大小,第三个参数是指定切片的容量
fmt.Println(slice)
//在默认情况下切片中元素的默认值为0
fmt.Println("slice len=",len(slice),"slice cap=",cap(slice))
slice[0] = 100
//如果要访问一个切片或者修改切片中的值,可以通过切片名访问下标名的方式来访问切片元素,从而修改值。
slice[2] = 200
//访问切片中的第三个元素
fmt.Println(slice)
}
打开手册找到 make 函数,对于 make 函数的介绍为:
内建函数make分配并初始化一个类型为切片、映射、或通道的对象。其第一个实参为类型,而非值。make 的返回类型与其参数相同,而非指向它的指针。其具体结果取决于具体的类型。
//make 不但可以创建切片,还可以创建 map 或者通道
切片: size 指定了其长度。该切片的容量等于其长度。切片支持第二个整数实参可用来指定不同的容量﹔它必须不小于其长度,因此 make([ ]int,0,10)
会分配一个长度为0,容量为10的切片。
(4)示例:
新建一个文件夹为 sliceuse,新建一个文件叫做 main.go
p
ackage main
i
mport (
“fmt”
)
func main()
{
//演示切片的使用 make
var slice []float64
//定义一个切片名为 slice,类型为 float64
//注意:如果是切片,直接使用 make 的话会出现错误
//对于切片,必须编写 make 之后再进行使用
fmt.Println(slice)
直接将 slice 进行输出,运行结果如下:
会发现在[]中没有任何东西
(5)如果使用 make:
var slice []float64 = make([]float64,5,10)
//定义五个元素和容量为10
再进行运行,效果如下:
可以看到5个元素出现,且他们的值都为0,因为没有将元素赋值,所以默认值为0。
(6)将 slice 赋值
s
lice[1] = 10
//将 slice 第2个元素赋值为10
s
lice[3] = 20
//将 slice 第4个元素赋值为20
运行结果如下:
对应的元素的值发生了变化
(7)fmt.Println("slice的size=",len(slice))
//输出 slice 的大小
fmt.Println("slice的cap=",cap(slice))
//输出 slice 的容量
输出结果如下:
可以得出,5为 slice 的大小,10为 slice 的容量
问题:如果用此方法使用 slice 在内存中是如何存在的呢?
答:
slice 的内存图:
//slice 仍然指向一个包含五个元素的空间,但是不会再有一个数组指向下方的空间,下方空间的数据只能通过 slice 来进行访问,且此数组对外是不可见的,程序员只能通过 slice 操作其元素,而无法通过数组操作里面的元素了。
(8)对上面代码的小结:
①通过 make 方式创建切片可以指定切片的大小和容量
②如果没有给切片的各个元素赋值,那么就会使用默认值[int, float=>0
,
string=>
“”,
bool=> false]
③通过 make 方式创建的切片对应的数组是由 make 底层维护,对外不可见,即只能通过 slice 去访问各个元素。
三.方式3
第三种方式:定义一个切片,直接就指定具体数组,使用原理类似 make 的方式。
(1)案例:func main() {
v
ar slice []int = []int {1,3,5}
//直接将切片的数组给 slice
f
mt.Println(slice)
}
(2)示例:
fmt.Println()
//换行var strSlice []string = []string{“tom”,”jack”,”mary”}
//直接进行分配、
f
mt.Println(“strS
lice
”, strS
lice
)
f
mt.Println(“strS
lice
size”, len(strS
lice
))
//输出大小
//返回值为3
f
mt.Println(“strS
lice
cap”, cap(strS
lice
))
//输出容量
运行效果如下:
因为没有指定大小,所以 slice 的大小为3。