说明

slice是go的一个语言特性,其实有点类似于cpp的vector,可变长度,可以扩展空间。今天详细看了下,做下总结。
slice本质上是一个区间,原型是[]T,大致的实现是这样的:

type slice struct {first *Tlen intcap int
}

可以看到的是是一个指向数组的指针,那么在修改slice的时候会改变数组的值。

用法

和数组的用法差别不是太大。

  • 基于数组的创建:
var myArrary [3]int = [3]int{1,2,3}
var mySlice []int = myArray[:2] //[first:last]方式,不足时补0
  • 直接创建:
mySlice = make([]int, 5)//创建了长度为5初值为0的切片
mySlice = make([]int, 5, 10)//创建了长度为5,容量为10的切片
  • 函数
    len() 返回元素的个数
    cap()返回容器大小
    append()新增元素
mySlice = append(mySlice, 1, 2, 3) //后者的参数类型其实是不定参数
mySlice2 = []int{7, 8, 9}
mySlice = append(mySlice, mySlice2...) 加入...表示打散后传入

copy()深复制slice

slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{1, 2, 3}
copy(slice2, slice1)//copy slice的前3个元素到slice2
slice2 = slice1 //会复制一份引用给slice2
  • 和数组区别
func arrayModify(array [5]int) {newArray := arraynewArray[0] = 88
}
func sliceModify(slice []int) {newSlice := slicenewSlice[0] = 88
}
func main() {array := [5]int{1, 2, 3, 4, 5}slice := []int{1, 2, 3, 4, 5}arrayModify(array)sliceModify(slice)fmt.Println(array)fmt.Println(slice)
}
// [1 2 3 4 5]
// [88 2 3 4 5]

可以看到的是数组传的是值,不会改变元素的值,这一点和c/cpp不同,而虽然slice也是值语义,但是其本身是指针类型的,所以会改变值,但不意味着slice传引用,这一点需要注意。后面会详细讲值语义带来的问题。

扩展阅读:

https://blog.csdn.net/bobodem/article/details/80188126

[Golang]slice的用法以及和数组的区别相关推荐

  1. JS中数组和字符串具有的方法,以及substring,substr和slice的用法与区别

     String 对象属性 属性 描述 constructor 对创建该对象的函数的引用 length 字符串的长度 prototype 允许您向对象添加属性和方法 String 对象方法 方法 描述 ...

  2. Golang slice原理

    数组 slice类型是建立在Go数组类型之上的抽象,因此要了解slice我们必须首先了解数组. 数组类型定义了长度和元素类型.例如,[4]int 类型表示一个由四个整数组成的数组.数组的大小是固定的, ...

  3. golang slice map扩容

    golang slice 扩容 操作系统预分配的内存规格 byte 8 16 32 64 80 96 112- 先求出当前切片容量x,求出append追加后的容量 y 判断 x*2 和y 的关系 1 ...

  4. Golang教程:(十一)数组和切片

    原文:https://golangbot.com/arrays-and-slices/ 这是本Golang系列教程的第十一篇. 数组 数组是类型相同的元素的集合.例如,整数 5, 8, 9, 79, ...

  5. golang slice扩容机制

    Slice expanse capacity slice这种数据结构便于使用和管理数据集合,可以理解为是一种动态数组,slice也是围绕动态数组的概念来构建的.既然是动态数组,那么slice是如何扩容 ...

  6. Golang Slice切片如何扩容

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

  7. jQuery中slice()方法用法实例

    本文实例讲述了jQuery中slice()方法用法.分享给大家供大家参考.具体分析如下: 此方法可以选取匹配元素集的子集. 语法结构: 复制代码 代码如下: $(selector).slice(sta ...

  8. Golang slice 的底层实现

    首先我们来看段代码的输出 s := make([][]int, 4)for i := 0; i < 4; i++ {s[i] = make([]int, 4)s[i][0] = 1}s0 := ...

  9. asp数组中REDIM的用法(动态数组)

    asp数组中REDIM的用法(动态数组) 动态数组里面的一个语句,只能出现在过程里面,可以多次使用.可以改变数组大小,和维数 格式: REDIM [Preserve] 数组名(下标1[下标2....] ...

最新文章

  1. Word查找的通配符和特殊字符!
  2. [HDOJ5869] Different GCD Subarray Query(RMQ,树状数组,离线)
  3. Partitioning Strategies
  4. 端口被占用的解决方案
  5. 华为机试HJ37:统计每个月兔子的总数(斐波那契数列)
  6. 2018JavaScript状态调查:5个重要的思考( import takeaways) (摘译)
  7. 淘宝APP购物车测试用例
  8. Linux netstat 命令安装
  9. 软件工程——背单词软件对比
  10. VBA-自动筛选符合条件的数据
  11. 浅谈CNN里的Lasso
  12. PHP商城源码-单个商品详情页、单品商品购买源码
  13. 让商家“二选一“,唯品会选错了自救道路?
  14. iOS必备小技巧(非常的全)
  15. Springboot中国古代史在线学习网站 毕业设计-附源码260839
  16. 语音控制Office
  17. 拼多多数据分析一二三面面经(HR面后综排挂)
  18. 写出语句的四元式序列
  19. 解决springmvc中添加了静态资源访问路径之后就访问不到Controller路径的问题
  20. html网页轮播速度,纯HTML+JS实现轮播

热门文章

  1. background-image使用svg如何改变颜色
  2. 小程序 封装table组件
  3. 故障公告:IIS应用程序池停止工作造成博客站点无法访问
  4. Linux中文档去掉windows文本的多余的回车符(^M)
  5. shell脚本1——变量 $、read、``
  6. Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum (离线树状数组+前缀xor)
  7. 【转】phpize学习
  8. 模糊推理机制 matlab,基于模糊综合评判推理机制的学生素质评价系统设计与实现...
  9. php原生sql语法,thinkphp执行原生SQL语句的实现方法
  10. php url传递变量,php – 在laravel中通过url传递变量