Go語言筆記--數組

1.數組Array

1)定義數組的格式:var <varName> [n] <type>, n >=0

2)數組長度也是類型的一部分,因此具有不同長度的數組爲不同類型

3)注意區分指向數組的指針和指針數組

4)數組在Go中爲數值類型

5)數組直接可以使用==或者!=進行比較,但是不可以使用<或者>

6)可以使用new來創建數組,此方法返回一個指向數組的指針

7)Go支持多維數組

定義數組的幾種形式代碼實例:

package main


import (
    "fmt"
)


func main() {
    fmt.Println("定義與初始化")
    //直接定義不賦初值,默認爲0
    var arr1 [5]int
    //直接賦值,只有3個元素
    arr2 := [3]int{1, 2, 3}
    //三個點代表任意多個元素
    arr3 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    //定義一個4行5列的二維數組
    var grid [4][5]int


    fmt.Println(arr1, arr2, arr3)
    //二維數組
    fmt.Println(grid)
}

輸出:
API server listening at: 127.0.0.1:33951
定義與初始化
[0 0 0 0 0] [1 2 3] [1 2 3 4 5 6 7 8 9]
[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]

2.遍歷

數組的遍歷,代碼中給出了三種不同的方法獲取,前兩種是獲取下標在得到元素,第三種是直接得到元素

package main


import (
    "fmt"
)


func main() {
    //數組遍歷
    arr := [...]int{1, 2, 3, 4}


    fmt.Println("第一種方法")
    for i := 0; i < len(arr); i++ {
        fmt.Println(arr[i])
    }


    //使用range遍歷
    fmt.Println("第二種方法")
    for i := range arr {
        fmt.Println(arr[i])
    }


    //使用range遍歷,不但可以獲取下標,還可以直接獲取到值
    fmt.Println("第三種方法")
    for i, v := range arr {
        fmt.Println(i, v)
    }
}

輸出:
API server listening at: 127.0.0.1:27912
第一種方法
1
2
3
4
第二種方法
1
2
3
4
第三種方法
0 1
1 2
2 3
3 4

3.值類型

1)錯誤代碼實例

package main


import (
    "fmt"
)


func printArray(arr [5]int) {
    for i, v := range arr {
        fmt.Println(i, v)
    }
}


func main() {
    var arr1 [5]int
    arr2 := [3]int{1, 2, 3}
    arr3 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    arr4 := [...]int{1, 2, 3, 4, 5}
    printArray(arr1)
    printArray(arr2)
    printArray(arr3)
    printArray(arr4)
}

上面的代碼在編譯的時候會出錯,提示如下:

arry.go:19: cannot use arr2 (type [3]int) as type [5]int in argument to printArray

arry.go:20: cannot use arr3 (type [9]int) as type [5]int in argument to printArray

這是什麼錯誤?這個錯誤就是printArray參數是一個長度爲5的數組但是arr2,和arr3的長度都不是5,因此不符合,所以會報錯,如果沒有這兩個的話則可以編譯通過並且可以運行。

2)局部修改數值實例

package main


import (
    "fmt"
)


func printArray(arr [5]int) {
    arr[0] = 100
    for i, v := range arr {
        fmt.Println(i, v)
    }
}


func main() {
    var arr1 [5]int
    arr2 := [...]int{1, 2, 3, 4, 5}
    fmt.Println("print arr1")
    printArray(arr1)
    fmt.Println("print arr2")
    printArray(arr2)
    fmt.Println(arr1, arr2)
}

輸出:
API server listening at: 127.0.0.1:36105
print arr1
0 100
1 0
2 0
3 0
4 0
print arr2
0 100
1 2
2 3
3 4
4 5
[0 0 0 0 0] [1 2 3 4 5]

可以看到兩個數組的0元素在printArray裏面都被修改爲了100但是回到主函數打印還是原來的值,因此可以理解,這個數組的參數轉遞是進行的值傳遞也就是拷貝操作,並不是傳遞的地址。

上述例子如果換成指針效果如何,看下代碼實例

package main


import (
    "fmt"
)


func printArray(arr *[5]int) {
    arr[0] = 100
    for i, v := range arr {
        fmt.Println(i, v)
    }
}


func main() {
    var arr1 [5]int
    arr2 := [...]int{1, 2, 3, 4, 5}
    fmt.Println("print arr1")
    printArray(&arr1)
    fmt.Println("print arr2")
    printArray(&arr2)
    fmt.Println(arr1, arr2)
}

輸出:
API server listening at: 127.0.0.1:45480
print arr1
0 100
1 0
2 0
3 0
4 0
print arr2
0 100
1 2
2 3
3 4
4 5
[100 0 0 0 0] [100 2 3 4 5]

這次可以看到,數組中的0元素被修改了,這也說明go語言的數組爲值類型

綜合實例:

package main


import "fmt"


func main() {
    fmt.Println("冒泡排序")
    a := [...]int{5, 2, 6, 3, 9}
    fmt.Println(a)
    num := len(a)
    for i := 0; i < num; i++ {
        for j := i + 1; j < num; j++ {
            if a[i] < a[j] {
                temp := a[i]
                a[i] = a[j]
                a[j] = temp
            }
        }
    }
    fmt.Println(a)
}
輸出:
API server listening at: 127.0.0.1:28022
冒泡排序
[5 2 6 3 9]
[9 6 5 3 2]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章