切片

切片是由数组建立的一种方便、灵活且功能强大的包装(Wrapper)。切片本身不拥有任何数据。它们只是对现有数组的引用。

因此切片的类型是引用类型。

一、切片的创建

1、先创建数组,再引用

  1. // 先创建一个数组
  2. var lis [10]int= [10]int{1,2,3,4,5,6,7,8,9,10}
  3. // 创建切片
  4. var sli = lis[:] // 从头到尾全切
  5. fmt.Println(sli) // [1 2 3 4 5 6 7 8 9 10]
  6. fmt.Printf("%T",sli) // []int
  7. // []内没有数字就是切片,有就是数组

2、直接创建切片

  1. var a []int=[]int{1,2,3,4,5} //切片初始化,类似于数组初始化

二、切片的修改

因为切片是引用类型,它是对数组的引用。所以切片的修改会影响原来的数组,数组的修改也会影响切片。

  1. var lis [10]int= [10]int{1,2,3,4,5,6,7,8,9,10}
  2. var b []int = lis[5:9] // 索引取值,左开右闭
  3. b[0]=999
  4. lis[6]=888
  5. fmt.Println(b)
  6. fmt.Println(lis)
  7. [999 888 8 9]
  8. [1 2 3 4 5 999 888 8 9 10]

三、切片的长度和容量

len() :长度,现在有多少值

cap() :容量,总共能放多少值,为引用的数组长度-切片首位索引

  1. var lis [10]int= [10]int{1,2,3,4,5,6,7,8,9,10}
  2. var b []int = lis[5:9]
  3. fmt.Println(len(b)) // 4
  4. fmt.Println(cap(b)) // 5 //(10-5)

四、使用make创建切片

用函数make([]T,len,cap)来创建切片类型的变量,就不用先创建数组了。

函数参数分别为:类型,长度和容量。

容量是可选参数, 默认值为切片长度。

make 函数原理为创建一个数组,并返回引用该数组的切片。

  1. var sli []int=make([]int,3,4)
  2. fmt.Println(len(sli)) // 3
  3. fmt.Println(cap(sli)) // 4

五、切片的修改和追加

1、修改

像列表一样用[索引]取值,修改值。

  1. var a []int=make([]int,3,4)
  2. a[0]=999
  3. a[2]=999 //切片用[]修改值,只能取最大长度修改,超出长度的容量不能用[]的方式取值修改
  4. a[3]=100 // 不行!!!会报错

2、追加:append

使用函数 append(slice []T,x ... T)[]T 可以将新元素追加到切片上。它会有一个返回值,是追加后的新的切片,所以需要用一个值来接受一下。

  1. var sli []int=make([]int,3,4)
  2. sli = append(sli,444)
  3. fmt.Println(len(sli)) // 4
  4. fmt.Println(cap(sli)) // 4

如果append函数添加的值,使切片长度超过最大容量,则会创建一个新的底层数组取代原本切片引用的数组。

原切片的元素被复制到这个新数组中,并返回引用这个新数组的切片。

这个新数组的长度是旧切片容量的两倍。而新切片的容量就等于这个新数组的长度。

所以现在新切片的容量是旧切片的两倍。

此时修改新切片的元素就不会影响原数组了。

  1. // make创建的切片的追加
  2. var sli []int=make([]int,3,4)
  3. fmt.Println(len(sli)) // 3
  4. fmt.Println(cap(sli)) // 4
  5. sli = append(sli,444)
  6. fmt.Println(len(sli)) // 4
  7. fmt.Println(cap(sli)) // 4
  8. sli = append(sli,555)
  9. fmt.Println(sli) // [0 0 0 444 555]
  10. fmt.Println(len(sli)) // 5
  11. fmt.Println(cap(sli)) // 8
  12. // 引用数组的切片的追加
  13. var lis [10]int= [10]int{1,2,3,4,5,6,7,8,9,10}
  14. var sli []int = lis[5:9]
  15. fmt.Println(lis) // [1 2 3 4 5 6 7 8 9 10]
  16. fmt.Println(sli) // [6 7 8 9]
  17. fmt.Println(len(sli)) // 4
  18. fmt.Println(cap(sli)) // 5
  19. sli = append(sli,444)
  20. sli[2] = 888 // 切片影响原来的数组
  21. fmt.Println(lis) // [1 2 3 4 5 6 7 888 9 444]
  22. fmt.Println(sli) // [6 7 888 9 444]
  23. fmt.Println(len(sli)) // 5
  24. fmt.Println(cap(sli)) // 5
  25. sli = append(sli,555)
  26. sli[1] = 777 // 新的切片不会影响原来的数组了
  27. fmt.Println(lis) // [1 2 3 4 5 6 7 888 9 444]
  28. fmt.Println(sli) // [6 777 888 9 444 555]
  29. fmt.Println(len(sli)) // 6
  30. fmt.Println(cap(sli)) // 10 新切片的容量是旧切片的两倍

六、切片的函数传值

因为切片的类型是引用类型,因此传值后,改变值会影响原来的值。

  1. var a []int=make([]int,4,5)
  2. fmt.Println(a) // [0 0 0 0]
  3. test2(a) // [111 0 0 0]
  4. // [111 0 0 0 555]
  5. fmt.Println(a) // [111 0 0 0]
  6. func test2(x []int) {
  7. x[0] = 111 // 修改a变量地址里的值
  8. fmt.Println(x) // [111 0 0 0]
  9. x = append(x,555) // copy的x的长度变化了,产生了新的切片
  10. fmt.Println(x) // [111 0 0 0 555]
  11. }

七、多维切片

一般直接初始化。

  1. var a [][]int=[][]int{{1,2,3},{2,3},{4,5,5,6,7,8,9}}
  2. fmt.Println(a) // [[1 2 3] [2 3] [4 5 5 6 7 8 9]]

八、切片的copy

把一个切片的元素copy到另一个切片上。

用函数copy(dst(目标), src(源))

  1. var a []int=make([]int,4,5)
  2. var b []int =[]int{1,2,3,4,5}
  3. fmt.Println(a) // [0 0 0 0]
  4. fmt.Println(b) // [1 2 3 4 5]
  5. //把b的数据copy到a上
  6. copy(a,b)
  7. fmt.Println(a) // [1 2 3 4] // 长度有多少就接受多少
  8. fmt.Println(b) // [1 2 3 4 5]
  9. --------------------------------------------------
  10. var a []int=make([]int,6,7)
  11. var b []int =[]int{1,2,3,4,5}
  12. fmt.Println(a) // [0 0 0 0 0 0]
  13. fmt.Println(b) // [1 2 3 4 5]
  14. //把b的数据copy到a上
  15. copy(a,b)
  16. fmt.Println(a) // [1 2 3 4 5 0] // 不足的用默认值补齐
  17. fmt.Println(b) // [1 2 3 4 5]

Go的切片的更多相关文章

  1. ArcGIS 10.0紧凑型切片读写方法

    首先介绍一下ArcGIS10.0的缓存机制: 切片方案 切片方案包括缓存的比例级别.切片尺寸和切片原点.这些属性定义缓存边界的存在位置,在某些客户端中叠加缓存时匹配这些属性十分重要.图像格式和抗锯齿等 ...

  2. 利用Python进行数据分析(5) NumPy基础: ndarray索引和切片

    概念理解 索引即通过一个无符号整数值获取数组里的值. 切片即对数组里某个片段的描述. 一维数组 一维数组的索引 一维数组的索引和Python列表的功能类似: 一维数组的切片 一维数组的切片语法格式为a ...

  3. 充电时间 Go中的数组、切片、map简单示例

    数组是固定长度的,依稀让我想起了VB:切片是动态的:map一般是键值对 package main import ( "fmt" ) func main() { var userna ...

  4. GO语言总结(3)——数组和切片

    上篇博文简单介绍了一下Go语言的基本类型——GO语言总结(2)——基本类型,本篇博文开始介绍Go语言的数组和切片. 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. ( ...

  5. [LeetCode] Arithmetic Slices 算数切片

    A sequence of number is called arithmetic if it consists of at least three elements and if the diffe ...

  6. 网络切片在5G中的应用

    SDNLAB君 • 16-11-25 •1509 人围观 5G和网络切片 当5G被广泛提及的时候,网络切片是其中讨论最多的技术.像KT.SK Telecom.China Mobile.DT.KDDI. ...

  7. KRPano资源分析工具使用说明(KRPano XML/JS解密 切片图批量下载 球面图还原 加密混淆JS还原美化)

    软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...

  8. 使用KRPano资源分析工具强力加密KRPano项目(XML防破解,切片图保护,JS反调试)

    软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...

  9. 使用KRPano资源分析工具一键下载全景网站切片图

    软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...

  10. 窥探Swift之数组安全索引与数组切片

    今天是元宵节,祝大家元宵节快乐!在Swift中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值.在使用数组时,一个常见的致命错误就是数组越界.如果在 ...

随机推荐

  1. Flink-v1.12官方网站翻译-P010-Fault Tolerance via State Snapshots

    通过状态快照进行容错 状态后台 Flink管理的键控状态是一种碎片化的.键/值存储,每项键控状态的工作副本都被保存在负责该键的任务管理员的本地某处.操作员的状态也被保存在需要它的机器的本地.Flink ...

  2. PostgreSQL 实现定时任务的 4 种方法

    数据库定时任务可以用于实现定期的备份.统计信息采集.数据汇总.数据清理与优化等.PostgreSQL 没有提供类似 Oracle.MySQL 以及 Microsoft SQL Sever 的内置任务调 ...

  3. 基于线段树的RMQ

    RMQ(Range Minimum/Maximum Query)区间最值查询,即给出长度为n的数组A,以及m组询问s.t(s<=t<=n),返回区间[s,t]中的最值. 基于线段树的方法实 ...

  4. Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad)【ABCD】

    比赛链接:https://codeforces.com/contest/1445 A. Array Rearrangment 题意 给定两个大小均为 \(n\) 的升序数组 \(a\) 和 \(b\) ...

  5. Educational Codeforces Round 9 C. The Smallest String Concatenation(字符串排序)

    You're given a list of n strings a1, a2, ..., an. You'd like to concatenate them together in some or ...

  6. uestc 1221 Ancient Go

    Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  Status Y ...

  7. enumerate() -- Python

    #!usr/bin/env python #coding:utf-8 ''' enumerate()说明: 1.enumerate()是Python的内置函数: 2.enumerate字面上是枚举.列 ...

  8. 【Java】位操作符

    位运算符 java支持的位运算符有7个,分为两类:位逻辑运算和移位运算.位逻辑运算符包括按位取反(~).按位与(&).按位或(|)和按位异或(^)4种,.移位运算符包括左移(<<) ...

  9. codeforces 1013B 【思维+并查集建边】

    题目链接:戳这里 转自:参考博客 题意:给一个n*m的矩阵,放入q个点,这q个点之间的关系是,若已知这样三个点(x1,y1),(x2,y1),(x1,y2),可以在(x2,y2)处生成一个新的点,对于 ...

  10. pycharm 与 anaconda 关联

    anaconda Anaconda指的是一个开源的Python发行版本,集成了许多数据分析的库. 使用tersorflow进行机器学习时常用Anaconda pycharm PyCharm是一种Pyt ...