返回顶部
首页 > 资讯 > 后端开发 > GO >Goslice切片使用示例详解
  • 406
分享到

Goslice切片使用示例详解

2024-04-02 19:04:59 406人浏览 薄情痞子
摘要

目录定义定义并初始化长度和容量由数组得到切片更多切割方式举例切片的长度和容量切片再切片slice是引用类型总结定义 切片区别于数组,是引用类型, 不是值类型。数组是固定长度的,而切片

定义

切片区别于数组,是引用类型, 不是值类型。数组是固定长度的,而切片长度是可变的,我的理解是:切片是对数组一个片段的引用。

var s1 []int    //定义一个存放int类型元素的切片
var s2 []string //定义一个存放string类型元素的切片
fmt.Println(s1, s2)
fmt.Println(s1 == nil) //true  为空  没有开辟内存空间
fmt.Println(s2 == nil) //true

打印结果:

解析: 说明我们已经声明定义成功了,但是并没有开辟内存空间,因为s1、s2的值为nil

定义并初始化

我们可以在定义的同时初始化

var s1 = []int{1, 2, 3}
var s2 = []string{"北苑", "长阳", "望京"}
fmt.Println(s1, s2)
fmt.Println(s1 == nil) //false
fmt.Println(s2 == nil) //false

打印结果:

解析: 初始化成功,s1 s2的值都不等于nil

长度和容量

分别使用len()、cap()获得切片的长度和容量

fmt.Printf("len(s1):%d cap(s1):%d\n", len(s1), cap(s1))
fmt.Printf("len(s2):%d cap(s2):%d\n", len(s2), cap(s2))

打印结果:

解析: 和我们预期的一致,长度和容量都为3

由数组得到切片

开篇我已经提到数组和切片的关系,这里在进一步讲一下:

  • 切片的本质是操作数组,只是数组是固定长度的,而切片的长度可变的
  • 切片是引用类型,可以理解为引用数组的一个片段;而数组是值类型,把数组A赋值给数组B,会为数组B开辟新的内存空间,修改数组B的值并不会影响数组A。而切片作为引用类型,指向同一个内存地址,是会互相影响的。
//定义一个数组
a1 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
s3 := a1[0:4] //基于一个数组切割  [0:4]左包含 右不包含  即为[1,2,3,4]
fmt.Println(s3)

打印结果:

注意:a1[0:4] 基于一个数组切割 [0:4]左包含 右不包含 即为[1,2,3,4]

更多切割方式举例

a1 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
s4 := a1[2:4] //[3 4]
s5 := a1[:4] //[1 2 3 4]
s6 := a1[2:] //[3 4 5 6 7 8 9]
s7 := a1[:]  //[1 2 3 4 5 6 7 8 9]
fmt.Println(s4)
fmt.Println(s5)
fmt.Println(s6)
fmt.Println(s7)

打印结果:

解析: 都符合上面提到的左包含,右不包含原则 s4从下标2开始截取,截取到下标4 s5省略了第一个参数,表示从下标0开始截取 s6省略了第二个参数,表示截取到最后一个元素 s7省略了两个参数,只填写了中间的冒号:,表示取全部元素

切片的长度和容量

切片的长度很好理解,就是元素的个数

切片的容量我们重点理解一下:在切片引用的底层数组中从切片的第一个元素到数组最后一个元素的长度(元素数量)

这么读起来可能有点抽象,我们看下面这个栗子就很好理解啦:

a1 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
s5 := a1[:4] //[1 2 3 4]
s6 := a1[2:] //[3 4 5 6 7 8 9]
s7 := a1[:]  //[1 2 3 4 5 6 7 8 9]
fmt.Printf("len(s5):%d cap(s5):%d\n", len(s5), cap(s5)) //4 9
fmt.Printf("len(s6):%d cap(s6):%d\n", len(s6), cap(s6)) //7 7
fmt.Printf("len(s7):%d cap(s7):%d\n", len(s7), cap(s7)) //9 9

打印结果:

解析: a1是数组长度为9,容量也为9,值是从1~9

s5/s6/s7都是切割数组a1得到的切片。

s5的长度为4,因为只有1 2 3 4这4个元素,容量为9,因为s5切片的第一个元素是1,而s5底层数组a1最后一个元素是9,1~9共9个元素,所以s5的容量为9。

s6的长度为7,因为s6的元素是39这7个元素;容量也为7,因为s5的底层数组最后一个元素是9,39共7个元素,所以s6的容量为7。

S7更好理解了,长度和容量都是9,小伙伴们自己理解一下。

切片再切片

我们可以对切片进行再切片操作

比如,我们针对上面的数据再次切片进行测试

s8 :=s6[3:]
fmt.Printf("len(s8):%d cap(s8):%d\n", len(s8), cap(s8)) //4 4

打印结果:

解析:我们知道可以对切片进行再次切片就可以,至于长度和容器大家搞明白上面的栗子,这个输出结果就是意料之中的了。

slice是引用类型

我们举个栗子来证明切片是引用类型

//定义数组
a1 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
//有数组切割成切片s6
s6 := a1[2:] //[3 4 5 6 7 8 9]
//切片再次切片,赋值给s8
s8 :=s6[3:] //[6 7 8 9]
//修改原始数组,把下标为2的值由3改为333
a1[2] = 333
//打印s6,发现s6中的3也变成了333
fmt.Println("s6:", s6) //[333 4 5 6 7 8 9]
//因为s8基于s6切片而成,我们测试一下切片再切片的引用传的
fmt.Println("s8:", s8) //[6 7 8 9]
//我们把原始数组下标为5的值由6改为666
a1[5] = 666
//打印s8切片,得到结果6也变成了666
fmt.Println("s8:", s8) //[666 7 8 9]

打印结果:

解析: 由此我们可以明确的知道切片是引用类型,当底层数组改变时,不管是切片,还是切片再切片,值都会改变。因为他们使用的是一个内存块,引用的一个内存地址。

总结

这篇文章介绍了切片的特点,如何定义切片,如果由数组切割切片,切片的引用类型特征,更多关于Go slice切片的资料请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Goslice切片使用示例详解

本文链接: https://lsjlt.com/news/151242.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Goslice切片使用示例详解
    目录定义定义并初始化长度和容量由数组得到切片更多切割方式举例切片的长度和容量切片再切片slice是引用类型总结定义 切片区别于数组,是引用类型, 不是值类型。数组是固定长度的,而切片...
    99+
    2024-04-02
  • goslice数组和切片使用区别示例解析
    目录正文数组和切片的区别数组的定义切片的定义数组和切片的相似之处数组的局限重新理解 sliceslice 的内存布局切片容量存在的意义切片常用操作创建切片往切片中添加元素切片复制从切...
    99+
    2023-01-03
    go slice 数组切片区别 go slice
  • python字符串切片及常用方法示例详解
    目录一、切片二、常用方法2.1 查找2.2 修改2.3 判断一、切片 切片:指对操作的对象截取其中一部分的操作,字符串、列表、元组都支持切片操作 语法:序列[开始位置下标:结束位置下...
    99+
    2023-05-15
    python字符串切片 python切片
  • Python列表切片用法示例
    本文实例讲述了Python列表切片用法。分享给大家供大家参考,具体如下: Python中符合序列的有序序列都支持切片(slice),例如列表,字符串,元组。 格式:【start:end:step】...
    99+
    2022-06-04
    切片 示例 列表
  • el-upload大文件切片上传实现示例详解
    目录背景htmljs备注背景 前端上传大文件时,会出现跨域错误等各类错误,另切片上传可以提高上传效率。固进行以下代码记录,方便后期cv() html <el-upload a...
    99+
    2023-03-15
    el upload大文件切片上传 el upload文件上传
  • python切片详解
    先从原理上分析切片运算:list的切片,内部是调用__getitem__,__setitem__,__delitem__和slice函数。而slice函数又是和range()函数相关的。给切片传递的键是一个特殊的slice对象。该对象拥有可...
    99+
    2023-01-31
    切片 详解 python
  • GoJs 图片绘图模板Picture使用示例详解
    目录前言go.Picture的使用go.Picture的属性width、height、desiredSize属性source属性flip属性imageStretch、imageAli...
    99+
    2023-05-16
    GoJs图片绘图模板--Picture GoJs Picture
  • requestAnimationFrame使用示例详解
    目录requestAnimationFrame--use是什么回调函数调用频率返回啥如何用window.requestAnimationFrame(callback);示例多个运行情...
    99+
    2023-02-21
    requestAnimationFrame使用 requestAnimationFrame实例
  • Collectionstream使用示例详解
    目录基础数据元素转StreamTerminal opt-Collectors.mappingTerminal opt-Collectors.toCollection&coll...
    99+
    2022-12-19
    Collection stream Collection stream方法
  • 数组切片的实例演示
    数组切片功能详解:获取部分元素:array[start:end]截取指定范围的元素(包含start,不包含end)。创建新数组:切片可创建包含指定索引元素的新数组。修改数组:切片可覆盖并...
    99+
    2024-04-30
    php python
  • vue卡片式点击切换图片组件使用详解
    本文实例为大家分享了vue卡片式点击切换图片组件,供大家参考,具体内容如下 因为公司业务的问题,最近在写vue项目,有了一个卡片图片的点击的需求,自己又不想写动画效果,就偷个懒,采用...
    99+
    2024-04-02
  • Go语言基础切片的创建及初始化示例详解
    目录概述语法一、创建和初始化切片make字面量二、使用切片赋值和切片切片增长遍历切片总结总示例示例一  两个slice是否相等示例二  两个数字是否包含概述 ...
    99+
    2024-04-02
  • Python 列表切片详解
    一、列表切片      切指–将某些东西切成小块。列表切片是从原始列表中提取列表的一部分的过程。在列表切片中,我们将根据所需内容(如,从何处开始,结束以及增量进行切片)剪切列表。      Python中符合序列的有序序列都支持切片(sli...
    99+
    2023-09-24
    python 开发语言
  • springboot bootcdn使用示例详解
    应用:直接使用bootcdn提供的静态资源,不需要本地存储 bootcdn 官网:https://www.bootcdn.cn/ staticfile cdn官网: http://w...
    99+
    2024-04-02
  • ResizeObserver API使用示例详解
    目录API介绍浏览器兼容性用法总结API介绍 当我们需要知道一个元素的大小变化或者屏幕横竖屏时,我们需要监听window.resize事件或者window.orientationch...
    99+
    2024-04-02
  • Java InheritableThreadLocal使用示例详解
    目录引子InheritableThreadLocal简单使用InheritableThreadLocal原理分析引子 public class InheritableThreadLo...
    99+
    2024-04-02
  • react使用useImperativeHandle示例详解
    目录1.前言2.useImperativeHandle初探3.获取元素的几种方式3.1 useRef:获取组件内部元素3.2 forwardRef:父组件获取子组件内部的一个元素3....
    99+
    2024-04-02
  • VUE mixin 使用示例详解
    目录mixin 混入组件 data 优先级高于 mixin data 优先级2 mixin 生命周期优先级mixin 中的生命周期函数和组件的生命周期函数都会执行,而且 mixin ...
    99+
    2022-11-13
    VUE mixin 使用 VUE mixin
  • TreeSet详解和使用示例
    TreeSet是Java集合框架中的一个类,它实现了SortedSet接口,底层使用红黑树实现,可以实现有序的插入和遍历。TreeS...
    99+
    2023-08-08
    TreeSet
  • Go中的nil切片和空切片区别详解
    Go语言在声明变量的时候,会自动对变量对应的内存区域进行初始化操作。每个变量会被初始化成其类型的默认值,例如: 整型和浮点型变量的默认值为0。 字符串变量的默认值为空字符串。 ...
    99+
    2022-06-07
    nil GO
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作