數(shù)組Array
Golang Array和以往認(rèn)知的數(shù)組有很大不同印衔。
1. 數(shù)組:是同一種數(shù)據(jù)類型的固定長度的序列。
2. 數(shù)組定義:var a [len]int传趾,比如:var a [5]int垢粮,數(shù)組長度必須是常量浮定,且是類型的組成部分经柴。一旦定義抠藕,長度不能變。
3. 長度是數(shù)組類型的一部分勺阐,因此卷中,var a[5] int和var a[10]int是不同的類型。
4. 數(shù)組可以通過下標(biāo)進(jìn)行訪問渊抽,下標(biāo)是從0開始蟆豫,最后一個元素下標(biāo)是:len-1
for i := 0; i < len(a); i++ {
}
for index, v := range a {
}
5. 訪問越界,如果下標(biāo)在數(shù)組合法范圍之外懒闷,則觸發(fā)訪問越界十减,會panic
6. 數(shù)組是值類型,賦值和傳參會復(fù)制整個數(shù)組愤估,而不是指針帮辟。因此改變副本的值,不會改變本身的值灵疮。
7.支持 "=="织阅、"!=" 操作符,因為內(nèi)存總是被初始化過的震捣。
8.指針數(shù)組 [n]*T荔棉,數(shù)組指針 *[n]T闹炉。
1.1.1. 數(shù)組初始化:
一維數(shù)組:
全局:
var arr0 [5]int = [5]int{1, 2, 3}
var arr1 = [5]int{1, 2, 3, 4, 5}
var arr2 = [...]int{1, 2, 3, 4, 5, 6}
var str = [5]string{3: "hello world", 4: "tom"}
局部:
a := [3]int{1, 2} // 未初始化元素值為 0。
b := [...]int{1, 2, 3, 4} // 通過初始化值確定數(shù)組長度润樱。
c := [5]int{2: 100, 4: 200} // 使用索引號初始化元素渣触。
d := [...]struct {
name string
age uint8
}{
{"user1", 10}, // 可省略元素類型。
{"user2", 20}, // 別忘了最后一行的逗號壹若。
}
代碼:
package main
import (
"fmt"
)
var arr0 [5]int = [5]int{1, 2, 3}
var arr1 = [5]int{1, 2, 3, 4, 5}
var arr2 = [...]int{1, 2, 3, 4, 5, 6}
var str = [5]string{3: "hello world", 4: "tom"}
func main() {
a := [3]int{1, 2} // 未初始化元素值為 0嗅钻。
b := [...]int{1, 2, 3, 4} // 通過初始化值確定數(shù)組長度。
c := [5]int{2: 100, 4: 200} // 使用引號初始化元素店展。
d := [...]struct {
name string
age uint8
}{
{"user1", 10}, // 可省略元素類型养篓。
{"user2", 20}, // 別忘了最后一行的逗號。
}
fmt.Println(arr0, arr1, arr2, str)
fmt.Println(a, b, c, d)
}
輸出結(jié)果:
[1 2 3 0 0] [1 2 3 4 5] [1 2 3 4 5 6] [ hello world tom]
[1 2 0] [1 2 3 4] [0 0 100 0 200] [{user1 10} {user2 20}]
多維數(shù)組
全局
var arr0 [5][3]int
var arr1 [2][3]int = [...][3]int{{1, 2, 3}, {7, 8, 9}}
局部:
a := [2][3]int{{1, 2, 3}, {4, 5, 6}}
b := [...][2]int{{1, 1}, {2, 2}, {3, 3}} // 第 2 緯度不能用 "..."赂蕴。
代碼:
package main
import (
"fmt"
)
var arr0 [5][3]int
var arr1 [2][3]int = [...][3]int{{1, 2, 3}, {7, 8, 9}}
func main() {
a := [2][3]int{{1, 2, 3}, {4, 5, 6}}
b := [...][2]int{{1, 1}, {2, 2}, {3, 3}} // 第 2 緯度不能用 "..."柳弄。
fmt.Println(arr0, arr1)
fmt.Println(a, b)
}
輸出結(jié)果:
[[0 0 0] [0 0 0] [0 0 0] [0 0 0] [0 0 0]] [[1 2 3] [7 8 9]]
[[1 2 3] [4 5 6]] [[1 1] [2 2] [3 3]]
值拷貝行為會造成性能問題,通常會建議使用 slice概说,或數(shù)組指針碧注。
package main
import (
"fmt"
)
func test(x [2]int) {
fmt.Printf("x: %p\n", &x)
x[1] = 1000
}
func main() {
a := [2]int{}
fmt.Printf("a: %p\n", &a)
test(a)
fmt.Println(a)
}
輸出結(jié)果:
a: 0xc42007c010
x: 0xc42007c030
[0 0]
內(nèi)置函數(shù) len 和 cap 都返回數(shù)組長度 (元素數(shù)量)。
package main
func main() {
a := [2]int{}
println(len(a), cap(a))
}
輸出結(jié)果:
2 2
多維數(shù)組遍歷:
package main
import (
"fmt"
)
func main() {
var f [2][3]int = [...][3]int{{1, 2, 3}, {7, 8, 9}}
for k1, v1 := range f {
for k2, v2 := range v1 {
fmt.Printf("(%d,%d)=%d ", k1, k2, v2)
}
fmt.Println()
}
}
輸出結(jié)果:
(0,0)=1 (0,1)=2 (0,2)=3
(1,0)=7 (1,1)=8 (1,2)=9
利用方法修改數(shù)組的值,(地址傳遞):
package main
import "fmt"
func printArr(arr *[5]int) {
arr[0] = 10
for i, v := range arr {
fmt.Println(i, v)
}
}
func main() {
var arr1 [5]int
printArr(&arr1)
fmt.Println(arr1) //arr1數(shù)組發(fā)生改變
}