使用切片的三种方式|学习笔记

简介: 快速学习使用切片的三种方式。

开发者学堂课程【GO 语言核心编程-基础语法、数组、切片、Map:使用切片的三种方式学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/625/detail/9638


使用切片的三种方式

 

内容介绍:

一、 方式1

一、 方式二2

一、 方式三3

 

切片的使用

 

一、方式1

第一种方式:定义一个切片,然后让切片去引用一个已经创建好的数组,比如前面的案列就是这样的。

案例:

func main() {

var arr [5]int = […]int{1,2,3,6,5}  //已经创建好的数组

var slice = arr[1:3]  //使用 slice 引用已经创建好的数组

fmt.Println(“arr=”,arr)

fmt.Println(“slice=”,slice)

fmt.Println(“slice len = ”, len(slice))

fmt.Println(“slice cap = ”, cap(slice))

}

 

二.方式2

第二种方式:通过 make 来创建切片 //使用内置函数直接创建切片

1基本语法:var 切片名[]type = make([]type,len,[cap])

2参数说明:type就是数据类型 len:大小 cap:指定切片容量,可选

//如果分配了 cap,则要求 cap>=len,否则语法是错误的

3案例:

func 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

package main

import (

“fmt”

)

func main() {

//演示切片的使用 make

var slice []float64  //定义一个切片名为 slice,类型为 float64

//注意:如果是切片,直接使用 make 的话会出现错误

//对于切片,必须编写 make 之后再进行使用

fmt.Println(slice)

直接将 slice 进行输出,运行结果如下:

image.png

会发现在[]中没有任何东西

5如果使用 make:

var slice []float64 = make([]float64,5,10)  //定义五个元素和容量为10

再进行运行,效果如下:

image.png

可以看到5个元素出现,且他们的值都为0,因为没有将元素赋值,所以默认值为0。

6将 slice 赋值

slice[1] = 10 //将 slice 第2个元素赋值为10

slice[3] = 20  //将 slice 第4个元素赋值为20

运行结果如下:

 image.png

对应的元素的值发生了变化

7fmt.Println("slice的size=",len(slice)) //输出 slice 的大小

fmt.Println("slice的cap=",cap(slice))  //输出 slice 的容量

输出结果如下:

image.png

可以得出,5为 slice 的大小,10为 slice 的容量

问题:如果用此方法使用 slice 在内存中是如何存在的呢?

答:

slice 的内存图:

//slice 仍然指向一个包含五个元素的空间,但是不会再有一个数组指向下方的空间,下方空间的数据只能通过 slice 来进行访问,且此数组对外是不可见的,程序员只能通过 slice 操作其元素,而无法通过数组操作里面的元素了。

image.png

8对上面代码的小结

通过 make 方式创建切片可以指定切片的大小和容量

如果没有给切片的各个元素赋值,那么就会使用默认值[int, float=>0 string=>“”, bool=> false]

通过 make 方式创建的切片对应的数组是由 make 底层维护,对外不可见,即只能通过 slice 去访问各个元素。

 

三.方式3

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

1案例:
func main() {

var slice []int = []int {1,3,5} //直接将切片的数组给 slice

fmt.Println(slice)

}

2示例:

fmt.Println() //换行
var strSlice []string = []string{“tom”,”jack”,”mary”} //直接进行分配、

fmt.Println(“strSlice”, strSlice)

fmt.Println(“strSlice size”, len(strSlice)) //输出大小

//返回值为3

fmt.Println(“strSlice cap”, cap(strSlice)) //输出容量

运行效果如下:

image.png

因为没有指定大小,所以 slice 的大小为3。

相关文章
Go语言中的数组、切片和映射解析
Go语言中的数组、切片和映射解析
|
6月前
|
Go C++ 容器
【Go语言快速上手(三)】数组, 切片与映射
【Go语言快速上手(三)】数组, 切片与映射
|
Go 索引
终于学会使用Go语言切片 切片操作看这里就够了
终于学会使用Go语言切片 切片操作看这里就够了
64 1
终于学会使用Go语言切片 切片操作看这里就够了
终于掌握append为切片添加元素的诀窍 切片动态增长看这里
终于掌握append为切片添加元素的诀窍 切片动态增长看这里
89 1
|
JSON C# 数据格式
数组比较的几种方式
1、string.Equals() ```csharp string[] strList1= new string[3] {"1", "2", "3"}; string[] strList2= new string[3] {"4", "5", "6"}; if (!string.Equals(strList1, strList2)) { // 比较数组的不同之处 } // 涉及到修改日志输出等数组可以直接json序列化然后用上述方法比较即可,如下 if (!string.Equals(JsonConvert.SerializeObject(list1), JsonConvert
76 0
|
搜索推荐 编译器 C++
C++基础:第5~6章:数组\函数
C++基础:第5~6章:数组\函数
52 0
|
算法
切片用法——去空格
切片用法——去空格
58 0
|
程序员 Go 开发者
使用切片的区别分析|学习笔记
快速学习使用切片的区别分析。
112 0
使用切片的区别分析|学习笔记
|
机器学习/深度学习 人工智能 开发者
Numoy 数组切片、迭代|学习笔记
快速学习 Numoy 数组切片、迭代
139 0
Numoy 数组切片、迭代|学习笔记
|
Go vr&ar 开发者
切片注意事项和细节(3) | 学习笔记
简介:快速学习切片注意事项和细节(3)
切片注意事项和细节(3) | 学习笔记