• Go——数组


            Golang Array和以往认知的数组有很大的。

    • 数组是同一种数据类型的固定长度的序列。
    • 数组定义:var a[len] int,比如:var a [5]int,数组长度必须是常量,且类型的组成部分。一旦定义,长度不能变。
    • 长度是数组类型的一部分,因此,var a[5] int和var a[10] int是不同的类型。
    • 数组可以通过下标进行访问,下标从0开始,最后一个元素下标是:len-1。
    1. for i := 0; i < len(a); i++ {
    2. }
    3. for index, v := range a {
    4. }
    • 访问越界,如果下标在数组合法范围之外,则触发访问越界,会panic。
    • 数组是值类型,赋值和传参会复制整个数组,而不是指针。因此改变副本的值,不会改变本身的值。
    • 至此"==","!="操作符,因为内存总是被初始化过的。
    • 指针数组 [n] *T,数组指针 *[n]T。

            1.数组初始化

    • 一维数组
    1. package main
    2. import (
    3. "fmt"
    4. )
    5. // 全局变量
    6. var arr0 [5]int = [5]int{1, 2, 3} //未初始化元素值为0
    7. var arr1 = [5]int{1, 2, 3, 4, 5}
    8. var arr2 = [...]int{1, 2, 3, 4, 5, 6} //通过初始化值来确定数组长度
    9. var str = [5]string{3: "hello world", 4: "tom"} //通过引号初始化元素
    10. func main() {
    11. //局部变量
    12. a := [3]int{1, 2} //未初始化元素值为0
    13. b := [...]int{1, 2, 3, 4, 5} //通过初始化值来确定数组长度
    14. c := [5]string{3: "hello world", 4: "tom"} //通过引号初始化元素
    15. d := [...]struct {
    16. name string
    17. age uint8
    18. }{
    19. {"user1", 10}, //可以省略元素类型
    20. {"user2", 20}, //不要忘记最后的逗号
    21. }
    22. fmt.Println(arr0, arr1, arr2, str)
    23. fmt.Println(a, b, c, d)
    24. }

    • 多维数组 
    1. package main
    2. import "fmt"
    3. //全局变量
    4. var arr0 [5][3]int
    5. var arr1 [2][3]int = [...][3]int{{1, 2, 3}, {4, 5, 6}}
    6. func main() {
    7. //局部变量
    8. a := [2][3]int{{1, 2, 3}, {4, 5, 6}}
    9. b := [...][2]int{{1, 2}, {3, 4}, {5, 6}} //第二维度不能为...
    10. fmt.Println(arr0, arr1)
    11. fmt.Println(a, b)
    12. }

    2. 数组值拷贝

            数组是值类型,赋值和传参会复制整个数组,而不是指针。

            值拷贝行为会造成性能问题,通常会建议使用slice,或数组指针

    1. package main
    2. import "fmt"
    3. func test(a [2]int) {
    4. fmt.Printf("test-a:%p\n", &a)
    5. a[0] = 100
    6. a[1] = 100
    7. }
    8. func main() {
    9. var a [2]int
    10. fmt.Printf("main-a:%p\n", &a)
    11. test(a)
    12. fmt.Println(a)
    13. }

            因为值拷贝,地址不同,数据有没有修改。 

    3. 内置函数

            内置函数len和cap都返回数组长度(元素数量)

    1. package main
    2. import "fmt"
    3. func main() {
    4. var arr [2]int = [2]int{1, 2}
    5. fmt.Println(len(arr), cap(arr))
    6. arr2 := [...][2]int{{1, 2}, {3, 4}} //二维数组,其中一维数组是它的元素
    7. fmt.Println(len(arr2), cap(arr2))
    8. }

    注意:string底层是byte数组([]byte),len一个string类型的遍历,得到的是byte数组的长度。 

            4. 多维数组遍历 

    1. package main
    2. import "fmt"
    3. func main() {
    4. arr2 := [...][2]int{{1, 2}, {3, 4}} //二维数组,其中一维数组是它的元素
    5. //使用内置函数len
    6. for i := 0; i < len(arr2); i++ {
    7. for j := 0; j < len(arr2[i]); j++ {
    8. fmt.Printf("arr2[%d][%d] = %d ", i, j, arr2[i][j])
    9. }
    10. }
    11. fmt.Println()
    12. //使用range
    13. for index1, v1 := range arr2 {
    14. for index2, v2 := range v1 {
    15. fmt.Printf("arr2[%d][%d] = %d ", index1, index2, v2)
    16. }
    17. }
    18. }

     5. 数组拷贝和传参

            使用指针传参。

    6. 数组练习

    • 求数组所有元素之和

    1. package main
    2. import (
    3. "fmt"
    4. "math/rand"
    5. "time"
    6. )
    7. func sumArr(a [10]int) int {
    8. sum := 0
    9. for i, v := range a {
    10. fmt.Printf("arr[%d]=%d ", i, v)
    11. sum += v
    12. }
    13. fmt.Println()
    14. return sum
    15. }
    16. func main() {
    17. //随机数种子
    18. rand.Seed(time.Now().Unix())
    19. var b [10]int
    20. for i := 0; i < len(b); i++ {
    21. b[i] = rand.Intn(1000) //产生一个0到1000的随机数
    22. }
    23. sum := sumArr(b)
    24. fmt.Println(sum)
    25. }
    • 找到数组中和为给定值的两元素下标
    1. package main
    2. import "fmt"
    3. func myTest(arr [6]int, val int) {
    4. for i := 0; i < len(arr); i++ {
    5. for j := len(arr) - 1; j > i; j-- {
    6. if arr[i]+arr[j] == val {
    7. fmt.Printf("(%d, %d)", i, j)
    8. }
    9. }
    10. }
    11. }
    12. func main() {
    13. arr := [...]int{1, 2, 3, 4, 5, 6}
    14. myTest(arr, 8)
    15. }

  • 相关阅读:
    【论文阅读 07】Anomaly region detection and localization in metal surface inspection
    美化QTabWidget(3)
    Java的I/O框架
    java中批量导出文件并压缩到zip文件中
    【Python数据科学快速入门系列 | 03】玩转数据摘取:Numpy的索引与切片
    py 打开多个页面
    python之计算平面点集的的面积
    第十四章 Productions最佳实践 - 创建或编辑路由进程
    MYSQL锁机制 - 锁的简述 | 索引对行级锁的影响
    NLP---文本前期预处理的几个步骤
  • 原文地址:https://blog.csdn.net/weixin_57023347/article/details/136661902