數組
數組是同一類型元素的集合。舉例:
package main
import "fmt"
func main() {
var a [2]string
a[0] = "Hello"
a[1] = "World"
fmt.Println(a)
primes := [6]int{2, 3, 5, 7, 11, 13}
// 也可自動根據元素個數計算數組長度
// primes := [...]int{1, 2, 3}
fmt.Println(primes)
}
數組的大小是類型的一部分。是以 [5]int 和 [25]int 是不同類型。舉例:
package main
func main() {
a := [3]int{5, 78, 8}
var b [5]int
b = a //會報錯!
}
Go 中的數組是值類型而不是引用類型。這意味着當數組指派給一個新的變量時,該變量會得到一個原始數組的一個副本。如果對新變量進行更改,則不會影響原始數組。
同樣,當數組作為參數傳遞給函數時,它們是按值傳遞,而原始數組保持不變。是以,把第一個大數組傳遞給函數會消耗很多記憶體。有兩種方法可以避免這種現象:一是傳遞數組的指針,二是使用數組的切片(常用)。
切片
數組具有固定長度的限制,在 Go 中,切片比傳統數組更常見,它不需要提前聲明大小。切片本身不擁有任何資料,它們隻是對現有數組的引用(它本身就是一個指針),總是指向一個底層array,是以它們不需要使用額外的記憶體。由于切片是引用類型,是以當引用改變其中元素的值時,其它所有的引用都會改變該值。
package main
import (
"fmt"
)
func main() {
a := [5]int{76, 77, 78, 79, 80}
var b []int = a[1:4] // creates a slice from a[1] to a[3]
fmt.Println(b)
}
對于數組
var a [10]int
來說,以下切片是等價的:
a[0:10]
a[:10]
a[0:]
a[:]
切片的長度和容量
切片的長度
len()
就是它所包含的元素個數。
切片的容量
cap()
是從它目前的第一個元素開始數,到其底層數組元素末尾的個數。如:
var a [5]int = {1,2,3,4,5}
b := a[0:2]
c := a[2:5]
len(b)為2,cap(b)為5
len(c)為3,cap(c)為3
切片的零值是
nil
。
nil
切片的長度和容量為 0 且沒有底層數組。
make()建立切片
當相關數組還沒有定義時,我們可以使用
make()
函數來建立一個切片,同時建立好相關數組。
package main
import (
"fmt"
)
func main() {
i := make([]int, 5, 5)
// i := []int{}
fmt.Println(i)
}
數組的長度是固定的,它的長度不能增加。 切片是動态的,使用
append(s []T,x ... T)
可以将新元素追加到切片上,傳回一個切片類型。
當新的元素被添加到切片時,會建立一個新的數組。現有數組的元素被複制到這個新數組中,并傳回這個新數組的新切片引用。現在新切片的容量是舊切片的兩倍。
map
map
映射将鍵映射到值。聲明文法:
var map1 map[keyType]ValueType
。未初始化的
map
的值是
nil
,即零值 ,
nil
映射既沒有鍵,也不能添加鍵,此時必須使用
make
函數進行初始化,或者在聲明的同時就初始化,如下:
personSalary := map[string]int {
"steve": 12000,
"jamie": 15000,
}
map
的一些操作:
package main
import "fmt"
func main() {
m := make(map[string]int)
// m := map[string][int]{}
m["Answer"] = 42
fmt.Println("The value:", m["Answer"])
m["Answer"] = 48
fmt.Println("The value:", m["Answer"])
delete(m, "Answer")
fmt.Println("The value:", m["Answer"])
v, ok := m["Answer"] //若Key在m中,ok為true
fmt.Println("The value:", v, "Present?", ok)
}
map
的周遊:
//使用 for range 周遊 map 時,不保證擷取的元素順序每次都相同。
for key, value := range map1 {
}
和 切片 類似,
map
也是引用類型。當
map
被指派為一個新變量的時候,它們指向同一個内部資料結構。是以,改變其中一個變量,就會影響到另一變量。
學習資料:https://studygolang.com/subject/2