天天看點

Go語言學習4:數組、切片、map映射數組切片map

數組

數組是同一類型元素的集合。舉例:

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