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]