文章说明

总结了go语言中切片slice的特殊性和使用时的注意事项。

个人理解,不足之处欢迎指出。

slice:切片,是go语言中一种常用的数据结构,基于数组构建,表示相同数据类型的集合。

数组

Go中数组类型表示固定长度的相同类型的数据的集合,数据在内存中连续存储,可以通过下标索引,但是又有特殊的地方:

  • 数组是值类型,一个数组变量表示整个数组,而不是指向数组的首元素的指针,这和C语言不同。
  • 将数组赋值给另一个数组,或者数组作函数参数传递时,会将数组的全部数据拷贝一份过去而不是传递一个指针。
  • 数组类型包括长度,即[5]int和[10]不是一种类型。

所以Go语言中使用数组传递数据效率很低,通常使用切片。

切片

切片是一个数组片段的描述,包含了指向数组片段的指针,片段的长度len和容量cap(数组片段的最大长度),但是切片本身并不是真正的指针类型

切片的特性

  1. 可以自动扩容 使用append()向切片追加数据,数据是被添加到切片指向的片段末尾,长度等于容量时切片就会自动扩容,扩容的细节后面的文章再讨论。
  2. 切片之间赋值或者切片作函数参数传递时,是将指向数组片段的指针传递过去,所以改变一个会影响另一个。

切片的陷阱

切片作函数参数传递或浅拷贝时,之所以改变一个切片的数据会影响另一个切片,是因为两个切片中中包含了指向同一数组片段的指针。

一切看似正常?但是当一个切片发生扩容时,会将当前切片内的数据复制到另一片内存区域,该切片的数组片段的地址发生改变,所以当切片扩容时修改一个切片的数据时不会再影响到另一个切片!此时只能通过传递切片本身的地址来解决。

扩容时出错的代码如下:

package mainimport "fmt"func testSlice(slice []int) {
slice = append(slice, 6, 7, 8, 9, 10)
fmt.Println("testSlice:",slice)
}
func main() {
slice := []int{1, 2, 3, 4, 5}testSlice(slice)
fmt.Println("main:",slice)
}
复制代码

切片的本质

所以,切片不是指针类型,切片数据类型是包含指向一个数组片段的指针,和当前数组片段的长度,以及当前数组最大容量的一种复合数据结构

Go slice切片的“陷阱”和本质相关推荐

  1. Go 语言编程 — 高级数据类型 — Slice 切片

    目录 文章目录 目录 切片 len() 和 cap() 函数 append() 和 copy() 函数 空切片 切片 Golang 中,切片(Slice)的本质是长度不固定的.可以追加元素的特殊数组, ...

  2. golang 定义一个空切片_Golang slice切片操作之切片的追加、删除、插入等

    本文介绍了Golang slice切片操作之切片的追加.删除.插入等,分享给大家,具体如下: 一.一般操作 1,声明变量,go自动初始化为nil,长度:0,地址:0,nil func main(){ ...

  3. JS 数组 isAarray() typeof push() unshift() splice()替换/删除/插入 slice()切片 join() split() reverse concat

    lianxuudadian    isAarray() shift转移 unshift取消转移 push pop   unshift shift splice 粘接 slice 切片 Join() s ...

  4. Go语言核心之美 3.2-slice切片

    Slice(切片)是长度可变的元素序列(与之对应,上一节中的数组是不可变的),每个元素都有相同的类型.slice类型写作[]T,T是元素类型.slice和数组写法很像,区别在于slice没有指定长度. ...

  5. 卷毛0基础学习Golang-基础-slice切片

    卷毛0基础学习Golang-基础-slice切片 持续更新中---- 切片简述 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数据结构无法完全满足开发者的真实需求. ...

  6. Go(03) slice切片的使用

    原文链接 http://www.limerence2017.com/2019/05/08/golang05/#more golang 的引用类型和内置类型变量 golang 中变量类型分为引用类型和值 ...

  7. Golang Slice切片如何扩容

    Golang Slice切片如何扩容 Golang轻松学习 文章目录 Golang Slice切片如何扩容 一.Slice数据结构是什么? 二.详细代码 1.数据结构 2.扩容原则 2.如何理解扩容规 ...

  8. go语言笔记——切片底层本质是共享数组内存!!!绝对不要用指针指向 slice切片本身已经是一个引用类型就是指针...

    切片 切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片是一个引用类型(因此更类似于 C/C++ 中的数组类型,或者 Python 中的 list 类型) ...

  9. golang中slice切片的修改操作

    本文主要介绍go语言中切片slice的增删修改操作. 如果我们需要往切片中追加元素,可以使用内置的append()函数.这个函数接受一个需要被追加的切片,以及一个或者多个需要被追加的元素.如果我们需要 ...

  10. golang slice 切片 追加、删除、插入

    一.一般操作 1,声明变量,go自动初始化为nil,长度:0,地址:0,nil func main(){var ss []string;fmt.Printf("length:%v \tadd ...

最新文章

  1. iOS中 UITableViewCell cell划线那些事 韩俊强的博客
  2. Linux 常用命令操作
  3. openwrt使用3G上网卡
  4. IDEA下JNI开发快速生成头文件方法
  5. Python爬虫实战(5):模拟登录淘宝并获取所有订单(1)
  6. PicGo+码云Gitee建立国内高速图床
  7. Badboy录制及参数化详细步骤来一波
  8. js中this的问题
  9. ASP.NET GridView中使用搜索框(SearchableGridView)
  10. 我发现我对人类活动的认识开始有一点点变化了
  11. CCF201803-3 URL映射(100分)【文本处理+暴力】
  12. Gram 矩阵性质及应用
  13. 嵌入式系统 期末复习提纲
  14. ROS入门教程(一)
  15. 王阳明:一个人不开心的真正原因:智慧不够
  16. RuntimeError: DataLoader worker (pid 4499) is killed by signal: Segmentation fault.检查内存条!
  17. java计算机毕业设计Web企业差旅在线管理系统源码+mysql数据库+系统+lw文档+部署
  18. 酒店、宾馆、饭店的区别
  19. java ms932_Shift_JIS, MS932 and Unicode(收藏自网络)
  20. 你想要的免费ppt资源(我帮你准备好啦!)

热门文章

  1. python基本数据类型(字节字符十进制十六进制二进制转换)
  2. 训练赛20160403
  3. js typeof instanceof
  4. django中时区设置
  5. sqltext的参数化处理
  6. office2010安装报错
  7. 第一篇:一个win32控制台程序
  8. osgearth_backfill重采样生成低精度金字塔数据
  9. cf1063A Oh Those Palindromes (贪心)
  10. vue自学入门-2(vue创建项目)