• Golang的数组、切片、映射


    数组

    数组的长度也是类型的一部分

    数组元素类型相同但是长度不同的两个数组认为类型不同

    数组初始化后默认值是零值

    数组元素类型前的方括号不能为空

            要么指定大小 要么用...填充从而实现自动计算长度

    数组变量相等意味着除了类型相同之外 所有的元素以及其索引相同

    1. //数组的长度也是类型的一部分
    2. var nums0 [10]int
    3. var nums1 [100]int
    4. fmt.Printf("nums0:%T\n", nums0)
    5. fmt.Printf("nums1:%T\n", nums1)
    6. //数组默认初始化为零值
    7. fmt.Println("nums0", nums0)
    8. //数组元素初始化 使用大括号
    9. //只有前两个元素被赋值
    10. var nums2 = [10]int{10, 20}
    11. fmt.Println("nums2", nums2)
    12. //指定位置赋值 索引:数值
    13. var nums3 = [10]int{0: 10, 9: 20}
    14. fmt.Println("nums3", nums3)
    15. //中括号内填写省略号 自动推导个数
    16. nums4 := [...]int{1, 2, 3}
    17. fmt.Println("nums4", nums4)
    18. //相同类型的数组变量可以相互赋值
    19. nums2, nums3 = nums3, nums2
    20. fmt.Println("nums2:", nums2)
    21. fmt.Println("nums3:", nums3)
    22. //Go语言中数组变量相等意味着所有元素相等
    23. nums5 := [3]int{1, 2, 3}
    24. nums6 := [3]int{1, 2, 3}
    25. nums7 := [3]int{2, 3, 4}
    26. fmt.Println(nums5 == nums6)
    27. fmt.Println(nums5 == nums7)
    28. //获取数组长度 数组的长度在定义后不能改变
    29. fmt.Println(len(nums7))
    30. //数组的遍历
    31. for index, value := range nums3 {
    32. fmt.Println(index, value)
    33. }
    34. //二维数组的遍历
    35. matrix := [3][2]int{{1, 2}, {3, 4}, {5, 6}}
    36. fmt.Printf("%#v\n", matrix)
    37. for _, v := range matrix {
    38. for _, vv := range v {
    39. fmt.Print(vv, " ")
    40. }
    41. fmt.Println()
    42. }

    切片

    数组的切片操作
    中括号内没长度(也没有省略号) 表示是切片类型
    [起始位置(闭区间):终止位置(开区间):切片容量]
    切片容量大于等于终止位置

    默认情况下切片容量等于终止位置-起始位置

    make函数创建切片

    make函数在底层会先初始化一个数组 数组长度为容量(第三个参数)
    第一个参数指定切片的类型
    第二个参数指定切片的长度
    第三个参数指定切片的容量(也可以不指出)

    切片增加元素 append函数 如果存不下 会创建新的数组空间

            因此需要接收返回值(新的数组地址)

    切片是传递引用 在内存上对应同一片区域
    当某一个切片的操作 引起内存中数组的容量不足时
    会重新申请新数组空间 不同切片之间的引用关系消失

    可以用切片模拟栈、队列这样的数据结构

    使用等号赋值时 数组传递值 切片传递引用

    1. //数组的切片操作
    2. //中括号内没长度(也没有省略号) 表示是切片类型
    3. //起始位置(闭区间):终止位置(开区间):切片容量
    4. //终止位置<=切片容量 默认切片容量等于终止位置-起始位置
    5. fmt.Println(nums3[0:2:2])
    6. fmt.Println(nums3[0:2:5])
    7. //创建一个切片变量
    8. var slice0 []int
    9. fmt.Printf("%T\n", slice0)
    10. fmt.Println(slice0 == nil)
    11. //获取切片的长度和容量
    12. fmt.Printf("%#v %d %d\n", slice0, len(slice0), cap(slice0))
    13. slice0 = []int{1, 2, 3, 4, 5}
    14. //获取切片的长度和容量
    15. fmt.Printf("%#v %d %d\n", slice0, len(slice0), cap(slice0))
    16. //make函数创建切片 make函数在底层会先初始化一个数组 数组长度为容量(第三个参数)
    17. //第一个参数指定切片的类型
    18. //第二个参数指定切片的长度
    19. //第三个参数指定切片的容量
    20. slice1 := make([]int, 3)
    21. fmt.Printf("%#v %d %d\n", slice1, len(slice1), cap(slice1))
    22. slice2 := make([]int, 3, 5)
    23. fmt.Printf("%#v %d %d\n", slice2, len(slice2), cap(slice2))
    24. //切片增加元素 append函数 如果存不下 会创建新的数组空间 因此需要接收返回值(新的数组地址)
    25. slice1 = append(slice1, 1)
    26. fmt.Printf("%#v %d %d\n", slice1, len(slice1), cap(slice1))
    27. //切片是传递引用 在内存上对应同一片区域
    28. //不同切片之间的操作可能引起相互覆盖
    29. slice3 := slice0[1:5]
    30. fmt.Println("slice3:", slice3, "slice0:", slice0)
    31. slice3[0] = 999
    32. slice3[1] = 999
    33. fmt.Println("slice3:", slice3, "slice0:", slice0)
    34. //当某一个切片的操作 引起内存中数组的容量不足时
    35. //会重新申请新数组空间 不同切片之间的引用关系消失
    36. slice3 = append(slice3, 5201314)
    37. fmt.Println("slice3:", slice3, "slice0:", slice0)
    38. //相互影响的效果消失
    39. slice3[0] = 0
    40. fmt.Println("slice3:", slice3, "slice0:", slice0)
    41. //切片的copy函数
    42. sliceCopy0 := make([]int, 3, 5)
    43. sliceCopy0 = []int{1, 2, 3}
    44. sliceCopy1 := []int{10, 20, 30, 40, 50}
    45. copy(sliceCopy0, sliceCopy1)
    46. //超出长度的不复制
    47. fmt.Println("sliceCopy0:", sliceCopy0, "sliceCopy1:", sliceCopy1)
    48. //删除索引为2的元素
    49. copy(sliceCopy1[2:], sliceCopy1[3:])
    50. fmt.Println(sliceCopy1)
    51. //去除最后一个元素
    52. fmt.Println(sliceCopy1[:len(sliceCopy1)-1])
    53. //切片模拟队列
    54. var queue []int
    55. queue = append(queue, 1)
    56. queue = append(queue, 2)
    57. queue = append(queue, 3)
    58. fmt.Println(queue)
    59. //切片模拟栈
    60. var stack []int
    61. stack = append(stack, 1)
    62. stack = append(stack, 2)
    63. stack = append(stack, 3)
    64. //输出栈顶元素
    65. fmt.Println(stack[len(stack)-1])
    66. //弹出栈顶元素 再输出
    67. stack = stack[:len(stack)-1]
    68. fmt.Println(stack[len(stack)-1])
    69. //数组在赋值时是值类型
    70. arrayTest0 := [...]int{1, 2, 3}
    71. arrayTest1 := arrayTest0
    72. arrayTest1[0] = 999
    73. fmt.Println(arrayTest0, arrayTest1)
    74. //切片在赋值时是引用类型
    75. sliceTest0 := []int{1, 2, 3}
    76. sliceTest1 := sliceTest0
    77. sliceTest1[0] = 999
    78. fmt.Println(sliceTest0, sliceTest1)
    79. //对切片进行简单排序 需要明确待排序元素的类型
    80. numsSort := []int{1, 3, 2, 4, 5}
    81. sort.Ints(numsSort)
    82. fmt.Println(numsSort)
    83. namesSort := []string{"hello", "test", "123", "abc"}
    84. sort.Strings(namesSort)
    85. fmt.Println(namesSort)
    86. //nil切片与空切片
    87. //var nums []int{} 切片底层的数组中没有存储元素
    88. //var nums []int 切片底层的数组指针指向nil

    映射 

    映射 也称为 map 字典 hashtable

    特点 多组key-value 的结构
    map[A]B 索引是A类型 值是B类型

    当查询不到key值时(key值不存在)返回零值

    不能通过是否返回零值判断key值是否存在

    应当通过分析返回的第二个参数判断key值是否存在

    1. //映射 map 字典 hashtable
    2. //特点 多组key-value 的结构
    3. //map[A]B 索引是A类型 值是B类型
    4. var scores map[string]int
    5. fmt.Printf("%T %#v\n", scores, scores)
    6. scores = map[string]int{"zpz": 99, "lh": 99}
    7. fmt.Println(scores)
    8. //查值
    9. fmt.Println(scores["zpz"])
    10. //当key不存在时 返回对应类型的零值
    11. fmt.Println(scores["hello"])
    12. //不能通过比较value是否等于零值判断key是否存在
    13. //应该通过第二个返回值判断key是否存在
    14. value, ifExist := scores["hello"]
    15. fmt.Println(value, ifExist)
    16. //遍历 遍历的顺序与添加数据的顺序无关
    17. for key, value := range scores {
    18. fmt.Println(key, value)
    19. }
    20. //删值
    21. delete(scores, "zpz")
    22. fmt.Println(scores)
    23. //多重映射
    24. var users map[string]map[string]string
    25. users = map[string]map[string]string{"zpz": {"1": "a", "2": "b"}, "lh": {"3": "c", "4": "d"}}
    26. fmt.Println(users)
    27. users["zpz"]["1"] = "999"
    28. fmt.Println(users)

  • 相关阅读:
    CleanMyMac X版本4.14.2中文版新功能介绍
    CRM系统中的销售漏斗有什么作用?
    软件测试之方案浅析
    极客日报:周鸿祎称当程序员比当老板幸福;英特尔i9-12900HK跑分超越苹果M1 Max;PyCharm 2021.2.3发布
    主键约束!
    SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.26 SpringBoot 整合 RocketMQ
    R语言ggplot2可视化:使用ggpubr包的ggbarplot函数可视化柱状图、使用label.pos参数在柱状图上方添加柱状图大小的数值标签
    MySQL
    使用SSE(Server-Sent Events)实现服务端给客户端发消息
    数据结构 冒泡排序 选择排序 学习笔记
  • 原文地址:https://blog.csdn.net/u014285914/article/details/126085567