go中slice的知识点总结

  • slice是什么
  • slice的结构
  • 常见的slice的坑

一、什么是slice

slice翻译成中文是切片的意思,而在go编程中slice是一个数据类型,其代表一个列表,类似于java中的List。我们可以为每一种go中的基础类型或自定义类型创建对应的切片。在这里我们可以将slice理解成一个列表,而在日常开发中不管是使用什么语言,都需要经常用到列表这种数据结构,比如java中的List,我们在日常使用Java的开发中十分常见。而与java不同的是go将列表也就是slice作为一种基本类型,而不是List这样的封装类。

二、slice的结构

slice结构如下,其内部存放了指向底层数组的指针、len(长度)、cap(容量)
在这里插入图片描述

三、常见的slice的坑

1、slice到底是值传递还是引用传递?
对于这个问题我相信很多人都对此有争议,我们先来看一段代码:
在这里插入图片描述
在上面这段代码中,我们定义了一个长度len为5的切片s,并将s赋值给了t,之后我们将t[0]的值修改成了99,最终我们发现,s[0]的值也发生了改变,以当前的现象来看slice是引用传递,我们先不急,再来看一段代码。
在这里插入图片描述
在这段代码中我们依然定义了一个长度为5,容量为10的切片s,并将s赋值给了t,然后向t中添加了一个元素6。分别打印s跟t,我们发现这次打印出来的内容并不一致,从这个现象看来又好像是值传递。这时候可能有些人会有些疑惑,为什么同时表现出了值传递与引用传递的现象。我们再来看一段代码。
在这里插入图片描述
这次我们在代码2的基础上分别打印了 s 与 t 的len、cap与底层数组的地址,我们发现 s 的len为5,t 的len为6,除此之外cap与底层数组的地址都是一致的。因此我们可以得出结论,slice在go中的应该是值传递,只不过当将 s 赋值给 t 时底层数组指针指向的是同一个底层数组,而len与cap都是拷贝的副本,所以 t 在append之后len发生变化而 s 中的len并不会因此发生改变,其传递过程如下:
在这里插入图片描述
以上是我对go中slice知识点的一点总结,若有不严谨或者不正确的表达请多多谅解并指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值