切片定义

切片是基于数组类型做的一层封装。它非常灵活,可以自动扩容。

  1. var a []int
  2. //定义一个int类型的空切片

切片初始化, a[start:end]创建一个包括从start到end-1的切片。

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. a := []int{, , , , }
  7. var b []int = a[:] //基于数组a创建⼀个切⽚,包括元素a[1] a[2] a[3]
  8. fmt.Println(b)
  9. }

切片初始化方法2

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. c := []int{, , } //创建⼀个数组并返回⼀个切⽚
  7. fmt.Println(c)
  8. }

数组切片的基本操作

切片基本操作
a) arr[start:end]:包括start到end-1(包括end-1)之间的所有元素
b) arr[start:]:包括start到arr最后一个元素(包括最后一个元素)之间的所有元素
c) arr[:end]:包括0到end-1(包括end-1)之间的所有元素
d) arr[:]:包括整个数组的所有元素

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func testSlice0() {
  8. var a []int
  9. if a == nil {
  10. fmt.Printf("a is nil\n")
  11. } else {
  12. fmt.Printf("a = %v\n", a)
  13. }
  14. a[] =
  15. }
  16.  
  17. func testSlice1() {
  18. a := []int{, , , , }
  19. var b []int
  20. b = a[:]
  21. fmt.Printf("slice b:%v\n", b)
  22. fmt.Printf("b[0]=%d\n", b[])
  23. fmt.Printf("b[1]=%d\n", b[])
  24. fmt.Printf("b[2]=%d\n", b[])
  25. fmt.Printf("b[3]=%d\n", b[])
  26. }
  27.  
  28. func testSlice2() {
  29. a := []int{, , , , }
  30.  
  31. fmt.Printf("slice a:%v type of a:%T\n", a, a)
  32. }
  33.  
  34. func testSlice3() {
  35. a := []int{, , , , }
  36. var b []int
  37. b = a[:]
  38. fmt.Printf("slice b:%v\n", b)
  39.  
  40. // c := a[1:len(a)]
  41. c := a[:]
  42. fmt.Printf("slice c:%v\n", c)
  43. //d := a[0:3]
  44. d := a[:]
  45. fmt.Printf("slice d:%v\n", d)
  46. // e := a[0:len(a)]
  47. e := a[:]
  48. fmt.Printf("slice e:%v\n", e)
  49. }
  50.  
  51. func testSlice4() {
  52. a := [...]int{, , , , , , , , }
  53.  
  54. fmt.Printf("array a:%v type of a:%T\n", a, a)
  55. b := a[:]
  56. fmt.Printf("slice b:%v type of b:%T\n", b, b)
  57. /*
  58. b[0] = b[0] + 10
  59. b[1] = b[1] + 20
  60. b[2] = b[2] + 30
  61. */
  62. /*
  63. for index, val := range b {
  64. fmt.Printf("b[%d]=%d\n", index, val)
  65. }
  66. */
  67. for index := range b {
  68. b[index] = b[index] +
  69. }
  70. fmt.Printf("after modify slice b, array a:%v type of a:%T\n", a, a)
  71. }
  72.  
  73. func testSlice5() {
  74. a := [...]int{, , }
  75. s1 := a[:]
  76. s2 := a[:]
  77. s1[] =
  78. fmt.Printf("a=%v s2=%v\n", a, s2)
  79. s2[] =
  80. fmt.Printf("a=%v s1=%v\n", a, s1)
  81. }
  82.  
  83. func main() {
  84. //testSlice0()
  85. //testSlice1()
  86. //testSlice2()
  87. //testSlice3()
  88. //testSlice4()
  89. testSlice5()
  90. }

test

切片修改

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. //创建一个数组,其中[…]是编译器确定数组的⻓度,darr的长度是9
  7. darr := [...]int{, , , , , , , , }
  8. //基于darr创建一个切片dslice,包括darr[2],darr[3],darr[4]三个元素
  9. dslice := darr[:]
  10. fmt.Println("array before",darr)
  11. for i := range dslice {
  12. //对于dslice中每个元素进行+1,其实修改是darr[2],darr[3],darr[4]
  13. dslice[i]++
  14. }
  15. fmt.Println("array after",darr)
  16. }
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. numa := []int{, ,}
  7. //创建一个切片,包含整个数组的所有元素
  8. nums1 := numa[:]
  9. nums2 := numa[:]
  10. fmt.Println("array before change 1",numa)
  11. nums1[] =
  12. fmt.Println("array after modification to slice nums1", numa)
  13. nums2[] =
  14. fmt.Println("array after modification to slice nums2", numa)
  15. }

使用make创建切片

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. //[]中没有长度
  7. i := make([]int, , )
  8. fmt.Println(i)
  9. }

切片的长度和容量

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. fruitarray := […]string{
  7. "apple", "orange", "grape",
  8. "mango", "water melon",
  9. "pine apple", "chikoo"}
  10. fruitslice := fruitarray[:]
  11. //长度是2,容量is 6
  12. fmt.Printf("length of slice %d capacity %d",
  13. len(fruitslice), cap(fruitslice))
  14. }
  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func testMake1() {
  6. var a []int
  7. a = make([]int, , )
  8. a[] =
  9. //a[1] = 20
  10. fmt.Printf("a=%v addr:%p len:%d cap:%d\n", a, a, len(a), cap(a))
  11. a = append(a, )
  12. fmt.Printf("a=%v addr:%p len:%d cap:%d\n", a, a, len(a), cap(a))
  13.  
  14. for i := ; i < ; i++ {
  15. a = append(a, i)
  16. fmt.Printf("a=%v addr:%p len:%d cap:%d\n", a, a, len(a), cap(a))
  17. }
  18. //观察切片的扩容操作,扩容的策略是翻倍扩容
  19. a = append(a, )
  20. fmt.Printf("扩容之后的地址:a=%v addr:%p len:%d cap:%d\n", a, a, len(a), cap(a))
  21. }
  22. /*
  23. a=[10 0 0 0 0] addr:0xc0000860a0 len:5 cap:10
  24. a=[10 0 0 0 0 11] addr:0xc0000860a0 len:6 cap:10
  25. a=[10 0 0 0 0 11 0] addr:0xc0000860a0 len:7 cap:10
  26. a=[10 0 0 0 0 11 0 1] addr:0xc0000860a0 len:8 cap:10
  27. a=[10 0 0 0 0 11 0 1 2] addr:0xc0000860a0 len:9 cap:10
  28. a=[10 0 0 0 0 11 0 1 2 3] addr:0xc0000860a0 len:10 cap:10
  29. a=[10 0 0 0 0 11 0 1 2 3 4] addr:0xc000098000 len:11 cap:20
  30. a=[10 0 0 0 0 11 0 1 2 3 4 5] addr:0xc000098000 len:12 cap:20
  31. a=[10 0 0 0 0 11 0 1 2 3 4 5 6] addr:0xc000098000 len:13 cap:20
  32. a=[10 0 0 0 0 11 0 1 2 3 4 5 6 7] addr:0xc000098000 len:14 cap:20
  33. 扩容之后的地址:a=[10 0 0 0 0 11 0 1 2 3 4 5 6 7 1000] addr:0xc000098000 len:15 cap:20
  34. */
  35.  
  36. func testMake2() {
  37. var a []int
  38. a = make([]int, , )
  39. //a[5] = 100
  40. a = append(a, )
  41. fmt.Printf("a=%v\n", a)
  42.  
  43. b := make([]int, , )
  44. fmt.Printf("b=%v len:%d cap:%d\n", b, len(b), cap(b))
  45. b = append(b, )
  46. fmt.Printf("b=%v len:%d cap:%d\n", b, len(b), cap(b))
  47. }
  48.  
  49. func main() {
  50. // testMake1()
  51. testMake2()
  52. }

切片的再切片

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func reslice() {
  6. a := [...]int{, , , , , , , , }
  7. b := a[:]
  8. fmt.Printf("b = %d len(b) = %d cap(b)=%d\n", b, len(b), cap(b))
  9. c := b[:cap(b)]
  10. fmt.Printf("c = %d len(c) = %d cap(c)=%d\n", c, len(c), cap(c))
  11. }
  12.  
  13. func main() {
  14. reslice()
  15. }
  16.  
  17. /*
  18. b = [3 4] len(b) = 2 cap(b)=7
  19. c = [3 4 5 6 4 7 8] len(c) = 7 cap(c)=7
  20. */

计算容量

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func testCap() {
  6. a := [...]int{, , , , , , }
  7. b := a[:]
  8. fmt.Print("b= %v len(b) = %d, cap(b) = %d\n", b, len(b), cap(b)) // 切片的容量 等于 原始素组的长度 减去 切片开始的索引
  9. }
  10.  
  11. func main() {
  12. testCap()
  13. }
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. fruitarray := […]string{
  7. "apple", "orange", "grape", "mango",
  8. "water melon", "pine apple", "chikoo"}
  9. fruitslice := fruitarray[:]
  10. //⻓度是2, 容量是6
  11. fmt.Printf("length of slice %d capacity %d\n",
  12. len(fruitslice), cap(fruitslice))
  13. //再重新进⾏切⽚,不能⼤于数组fruitarray的⻓度,否则越界
  14. fruitslice = fruitslice[:cap(fruitslice)]
  15. fmt.Println("After re-slicing length is”,
  16. len(fruitslice), "and capacity is",cap(fruitslice))
  17. }

append操作

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. cars := []string{"Ferrari", "Honda", "Ford"}
  9. //长度和容量都等于3
  10. fmt.Println("cars:", cars, "has old length", len(cars), "and capacity", cap(cars))
  11. cars = append(cars, "Toyota")
  12. //容量等于6
  13. fmt.Println("cars:", cars, "has new length",
  14. len(cars), "and capacity", cap(cars))
  15. }
  16. /*
  17. cars: [Ferrari Honda Ford] has old length 3 and capacity 3
  18. cars: [Ferrari Honda Ford Toyota] has new length 4 and capacity 6
  19. */

空切片

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. //定义names是一个空切片,长度和容量都等于0
  7. //不能对空切片进行访问,否则panic
  8. var names []string
  9. if names == nil {
  10. fmt.Println("slice is nil going to append")
  11. names = append(names, "John", "Sebastian", "Vinay")
  12. fmt.Println("names contents:",names)
  13. }
  14. }
  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func test() {
  6. var a []int
  7.  
  8. fmt.Printf("addr = %p len=%d cap =%d\n", a, len(a), cap(a))
  9. // a[0]=100 报错
  10.  
  11. if a == nil {
  12. fmt.Printf("a is nil\n")
  13. }
  14.  
  15. a = append(a, )
  16. fmt.Printf("addr = %p len=%d cap =%d\n", a, len(a), cap(a))
  17. a = append(a, )
  18. fmt.Printf("addr = %p len=%d cap =%d\n", a, len(a), cap(a))
  19. a = append(a, )
  20. fmt.Printf("addr = %p len=%d cap =%d\n", a, len(a), cap(a))
  21. a = append(a, )
  22. fmt.Printf("addr = %p len=%d cap =%d\n", a, len(a), cap(a))
  23.  
  24. }
  25. /*
  26. addr = 0x0 len=0 cap =0
  27. a is nil
  28. addr = 0xc0000100e0 len=1 cap =1
  29. addr = 0xc000010100 len=2 cap =2
  30. addr = 0xc00000a3c0 len=3 cap =4
  31. addr = 0xc00000a3c0 len=4 cap =4
  32. */
  33.  
  34. func main() {
  35. test()
  36. }

append一个切片

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. veggies := []string{"potatoes","tomatoes","brinjal"}
  7. fruits := []string{"oranges","apples"}
  8. //fruits后面的3个点表示展开fruits切片成一个个元素
  9. food := append(veggies, fruits...)
  10. fmt.Println("food:",food)
  11. }
  12. // food: [potatoes tomatoes brinjal oranges apples]
  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func test() {
  6. var a []int = []int{, , }
  7. b := []int{, , }
  8. c := append(a, b...)
  9. fmt.Printf("a=%v\n", a)
  10. fmt.Printf("b=%v\n", b)
  11. fmt.Printf("c=%v\n", c)
  12. }
  13. /*
  14. a=[1 2 3]
  15. b=[4 5 6]
  16. c=[1 2 3 4 5 6]
  17. */
  18.  
  19. func main() {
  20. test()
  21. }

切片传参

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. //在函数内部修改numbers切⽚的值
  8. func subtactOne(numbers []int) {
  9. for i := range numbers {
  10. numbers[i] -=
  11. }
  12. }
  13. func main() {
  14. nos := []int{, , }
  15. fmt.Println("slice before function call", nos)
  16. subtactOne(nos)
  17. //nos修改生效了,说明切片是引用类型
  18. fmt.Println("slice after function call", nos)
  19. }
  20. /*
  21. slice before function call [8 7 6]
  22. slice after function call [6 5 4]
  23. */
  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func testSum(a []int) int {
  6. sum :=
  7. for _, v := range a {
  8. sum += v
  9. }
  10. return sum
  11. }
  12.  
  13. func testChange(a []int) {
  14. a[] =
  15. }
  16.  
  17. func main() {
  18. a := [...]int{, , , , , }
  19. // sum := testSum(a[:])
  20. // fmt.Printf("sum = %d", sum) //
  21.  
  22. fmt.Printf("a=%v\n", a)
  23. testChange(a[:])
  24. fmt.Printf("a=%v", a)
  25.  
  26. /*
  27. a=[1 2 3 4 5 6]
  28. a=[1000 2 3 4 5 6]
  29. */
  30. }

切片拷贝

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. veggies := []string{"potatoes", "tomatoes", "brinjal"}
  9. fruits := []string{"oranges", "apples"}
  10. copy(veggies, fruits)
  11. fmt.Println(veggies, fruits) //[oranges apples brinjal] [oranges apples]
  12. }
  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func testCopy() {
  6. a := []int{, , }
  7. b := []int{, , }
  8.  
  9. copy(a, b)
  10. fmt.Printf("a = %v\n", a) // [4,5,6]
  11. fmt.Printf("b = %v\n", b) // [4,5,6]
  12.  
  13. c := []int{, }
  14. d := []int{, , }
  15.  
  16. e := copy(c, d)
  17. fmt.Printf("c = %v\n", c) // [4,5]
  18. fmt.Printf("d = %v\n", d) // [4,5,6]
  19. fmt.Printf("e = %v\n", e) //
  20.  
  21. b[] =
  22. fmt.Printf("a = %v\n", a) // [4,5,6]
  23. fmt.Printf("b = %v\n", b) // [100 5 6]
  24.  
  25. aa := [...]int{, , , , , }
  26. bb := aa[:]
  27. cc := []int{, , }
  28. copy(bb, cc)
  29. fmt.Printf("aa = %v\n", aa) // [10 20 30 4 5 6]
  30. fmt.Printf("bb = %v\n", bb) // [10 20 30 4 5 6]
  31. fmt.Printf("cc = %v\n", cc) // [10 20 30]
  32.  
  33. }
  34.  
  35. func main() {
  36. testCopy()
  37. }

切片遍历

  1. var a []int
  2. a[] =
  3. a[] =
  4. a[] =
  5. b := a[:]
  6. for index, val := range b {
  7. }
  8. //和数组遍历一样

make和new区别

make为内建类型slice、map和channel分配内存。

  1. //初始化一个切片
  2. s := make([]int, , )

new用于各种类型的内存分配,new返回是一个指针。

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. 当给属性添加final 时候 则无法进行第二次值的修改

  2. 题解 CF762A 【k-th divisor】

    emmm...不能说是水题吧...小金羊以为考的是STL(手动滑稽)... 行,这个题说让分解因数(不一定非得质因数). 我们考虑到有第k个数有可能有\(x\cdot x=n\)的毒瘤情况, 并且题目 ...

  3. c++11 右尖括号>改进

    c++11 右尖括号>改进 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> # ...

  4. python 求两个时间差

    def timeInterval(self): today = datetime.date.today() print today modifiedTime = os.stat(filename).s ...

  5. 【bzoj2034】 2009国家集训队—最大收益

    http://www.lydsy.com/JudgeOnline/problem.php?id=2034 (题目链接) 题意 n个任务,每个任务只需要一个时刻就可以完成,完成后获得${W_i}$的收益 ...

  6. LGP4588[JSOI2018]扫地机器人

    题解 需要先说明一点东西: 1 同一副对角线方向相同,共有$gcd(n,m)$条不同的副对角线,机器人的行为是一个$gcd(n,m)$的循环:: 如果左上方是$(1,1)$,容易看出所有的路径是从左或 ...

  7. jQuery EasyUI 下拉菜单获取日期,最高年份为当前年份,最低年份为当前年份向前推10年

    http://blog.csdn.net/wangjingjing1014/article/details/16885341 <head><meta http-equiv=" ...

  8. 图像bayer格式介绍以及bayer插值原理CFA

    1 图像bayer格式介绍 bayer格式图片是伊士曼·柯达公司科学家Bryce Bayer发明的,Bryce Bayer所发明的拜耳阵列被广泛运用数字图像. 对于彩色图像,需要采集多种最基本的颜色, ...

  9. sqlalchemy常用语法

    一.新增数据 # 新增一条数据 user_obj = User(name="bigberg", passwd="twgdh123") Session.add(u ...

  10. Hadoop生态圈-hbase介绍-完全分布式搭建

    Hadoop生态圈-hbase介绍-完全分布式搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.