切片Slice在go语言中是单独的类型(指向底层的数组),不同于python(对可迭代对象操作的工具),注意区分数组和slice的区别

  • 定义一个空slice,格式var s []int,这种既没有长度也没有元素赋值的类型(相比叫array)

  • 数组的基本操作如下 ,类似与python中列表切片的操作,详见实例

    1. package main
    2. import "fmt"
    3. func main() {
    4. var s1 []int //这样就是一个slice类型,既没有长度也没有元素赋值
    5. a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //这是一个数组
    6. s2 := a[5:10] //切片,索引5到10的元素,不包含索引为10
    7. s3 := a[:3] //切片,索引1-3的元素,不包含索引3
    8. s4 := a[6:] //切片,第6个索引到最后一个索引的元素
    9. s5 := a[:] //切片,复制一个数组
    10. fmt.Println(s1)
    11. fmt.Println(a)
    12. fmt.Println(s2) //数组的切片,类似python
    13. fmt.Println(s3)
    14. fmt.Println(s4)
    15. fmt.Println(s5)
    16. }
    17. /*输出
    18. s1---> []
    19. a---> [0 0 0 0 0 0 0 0 0 0]
    20. s2---> [6 7 8 9 10]
    21. s3---> [1 2 3]
    22. s4---> [7 8 9 10]
    23. s5---> [1 2 3 4 5 6 7 8 9 10]
    24. */

使用make初始化一个slice类型,包含三个参数

  • ①切片类型 []int

  • ②初始长度 len

  • ③容量 cap

    1. package main
    2. import "fmt"
    3. func main() {
    4. s1 := make([]int, 3, 10) //使用make初始化一个slice,包含三个参数:①切片类型②初始长度③容量
    5. fmt.Println(len(s1), cap(s1)) //输出长度,容量
    6. fmt.Println(s1)
    7. }
    8. /*输出:
    9. len(s1)--->3
    10. cap(s1)--->10
    11. s1---> [0 0 0] //可变数组
    12. */

Reslice ,在原slice基础上再次切片,slice一个数组时,不仅取出了len,同时容量也会得到相应的切片。

  • 示例

    1. //Reslice,在slice基础上再次slice.
    2. package main
    3. import "fmt"
    4. func main() {
    5. a := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'k', 'm'} //定义一个数组,元素为byte类型
    6. sa := a[3:5] // slice切片,取索引三到五,不包含索引5
    7. sb := sa[1:3]
    8. fmt.Println(string(sa))
    9. fmt.Println(len(sa), cap(sa))
    10. fmt.Println(string(sb))
    11. fmt.Println(len(sb), cap(sb))
    12. }
    13. /*输出
    14. sting(sa)---> de
    15. len(sa)---> 2
    16. cap(sa)---> 6
    17. string(sb)---> ef
    18. len(sb)---> 2
    19. cap(sb)---> 5
    20. */

Append,类似python中list类型,使用append,从数组尾部追加元素

  • 可以将一个slice追加在另一个slice尾部

  • 如果最终长度未超过追加到slice的容量,则返回原始slice

  • 如果超过追加的slice的容量则将重新分配数组并拷贝原始数据

    1. package main
    2. import "fmt"
    3. func main() {
    4. s1 := make([]int, 3, 8) //初始化slice,长度位3,容量为8
    5. fmt.Printf("%p\n", s1) //输出s1的内存地址
    6. fmt.Println(s1)
    7. s1 = append(s1, 1, 2, 3) //末尾追加三个元素,cap依然为8
    8. fmt.Printf("%p\n", s1) //原来的slice
    9. fmt.Println(s1)
    10. s1 = append(s1, 1, 2, 3, 4) //继续追加元素,超过原s1容量,会重新分配新的内存地址
    11. fmt.Printf("%p\n", s1) //cap容量超过8,为9
    12. fmt.Println(s1)
    13. }
    14. /*
    15. p*s1---> 0xc042070040
    16. s1---> [0 0 0]
    17. p*s1s1--> 0xc042070040
    18. s1---> [0 0 0 1 2 3]
    19. p*s1---> 0xc04205e080 //新的内存地址
    20. s1---> [0 0 0 1 2 3 1 2 3 4]
    21. */
  • 当两个slice同时指向某一个数组时,改变某一个slice索引时,另一个slice索引值及原数组的索引也会改变

    1. package main
    2. import "fmt"
    3. func main() {
    4. a := []int{1, 2, 3, 4, 5, 6}
    5. s1 := a[2:5]
    6. s2 := a[1:3]
    7. fmt.Println(s1, s2)
    8. s1[0] = 9
    9. fmt.Println(s1, s2)
    10. fmt.Println(a)
    11. }
    12. /*
    13. s1---> [3 4 5]
    14. s2---> [2 3]
    15. //更改s1的slice索引后,s2的索引也会改
    16. s1---> [9 4 5]
    17. s2---> [2 9]
    18. a---> [1 2 9 4 5 6]
    19. */

copy,格式 copy(s1,s2), 将s2拷贝到s1数组中,当len(s1) > len(s2)时,最终将s2中的索引

替换掉s1的索引,当len(s1)<len(s2)时,s1的索引值全部被对应s2的索引替换

  • 示例

    1. package main
    2. import "fmt"
    3. func main() {
    4. s1 := []int{1, 2, 3, 4, 5}
    5. s2 := []int{6, 7, 8}
    6. copy(s1, s2) //将s2的元素拷贝到s1,s2
    7. fmt.Println(s1)
    8. copy(s2, s1)
    9. fmt.Println(s2)
    10. copy(s1, s2[2:3]) //只拷贝某一切片的索引
    11. fmt.Println(s1)
    12. }
    13. /*输出
    14. s1---> [6 7 8 4 5]
    15. s2---> [1 2 3]
    16. s1---> [8 2 3 4 5]
    17. */

golang基础---Slice切片的更多相关文章

  1. GoLang基础数据类型-切片(slice)详解

    GoLang基础数据类型-切片(slice)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数 ...

  2. golang:slice切片

    一直对slice切片这个概念理解的不是太透彻,之前学习python的就没搞清楚,不过平时就用python写个工具啥的,也没把这个当回事去花时间解决. 最近使用go开发又遇到这个问题,于是打算彻底把这个 ...

  3. 【玩转Golang】slice切片的操作——切片的追加、删除、插入等

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

  4. golang slice切片的原理以及内置函数cap, len

    golang中slice(切片)是常用的类型, slice是对数组进行封装 package main import ( "fmt" "strconv") fun ...

  5. golang slice 切片原理

    golang 中的 slice 非常强大,让数组操作非常方便高效.在开发中不定长度表示的数组全部都是 slice .但是很多同学对 slice 的模糊认识,造成认为golang中的数组是引用类型,结果 ...

  6. Golang基础之函数

    golang基础之函数 1.为什么需要函数? 有些相同的代码可能出现多次,如果不进行封装,那么多次写入到程序中,会造成程序冗余,并且可读性降低 2.什么是函数 为完成某些特定功能的程序指令集合称为函数 ...

  7. Golang 基础之基础语法梳理 (一)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第一章节 Golang 基础之基础语法梳理 (一) Gol ...

  8. Golang基础教程

    以下使用goland的IDE演示,包含总计的golang基础功能共20个章节 一.go语言结构: 二.go基础语法: 三.变量 四.常量 五.运算符 六.条件语句 七.循环 八.函数 九.变量作用域 ...

  9. Go语言基础之切片

    Go语言基础之切片 本文主要介绍Go语言中切片(slice)及它的基本使用. 引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. 例如: func arraySum(x ...

随机推荐

  1. 转:javascript判断IE浏览器

    http://blog.csdn.net/ranbolwb/article/details/18555847 function isIE() { //ie? if (!!window.ActiveXO ...

  2. JDBC mysql 中文查询不到数据解决

    问题现象: Selenium自动测试中,使用JDBC查询mysql数据库中数据,查询条件为中文,例如: select * from XXX where name ='我是测试数据'; 查询结果为空:但 ...

  3. 二十三、MongoDb 数据库介绍、安装、启动和连接(非关系型数据库)

    1.数据库和文件的主要区别 1. 数据库有数据库表.行和列的概念,让我们存储操作数据更方便2. 数据库提供了非常方便的接口,可以让 nodejs.php java .net 很方便的实现增加修改删除功 ...

  4. 910. Smallest Range II

    Given an array A of integers, for each integer A[i] we need to choose either x = -K or x = K, and ad ...

  5. JQuery的基本用法总结

    1.jquery概念 是js的一个类库    (对js中某些功能的封装) 用jq实现的功能一定能用js实现 反过来 不一定  ,js实现的功能jq不一定能实现 2.jquery好处 1.代码简洁 2. ...

  6. sublime基本命令和使用

    Ctrl+Shift+p  Package Control Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选 ...

  7. BZOJ3510 首都

    题目描述 在X星球上有N个国家,每个国家占据着X星球的一座城市.由于国家之间是敌对关系,所以不同国家的两个城市是不会有公路相连的. X星球上战乱频发,如果A国打败了B国,那么B国将永远从这个星球消失, ...

  8. [ActionSprit 3.0] FMS服务器带宽检测

    package { import flash.display.Sprite; import flash.net.NetConnection; import flash.events.NetStatus ...

  9. Postman使用手册1——导入导出和发送请求查看响应

    导读: 现在的web和移动开发,常常会调用服务器提供restful接口进行数据请求,为了调试,一般会先用工具进行测试,通过测试后才开始在开发中使用.这里介绍一下如何在chrome浏览器利用postma ...

  10. [转]iOS系列译文:深入理解 CocoaPods

    Cocoapods是 OS X 和 iOS 下的一个第三方库管理工具.你能使用CocoaPods添加被称作“Pods”的依赖库,并轻松管理它们的版本,而不用考虑当前的时间和开发环境. Cocoapod ...