網頁

2021/6/20

Golang Map 簡單範例

Go語言的Map(映射)是一組無順序單一型態元素的集合,以另一型態的鍵(key)作為值(value)的索引。


Go使用內建的make(T)函式及map[keyType]elementType建立map。keyType為key的型態;elementType為元素(value)的型態。

例如下面宣告一個map變數m,key型態為int;value型態為string

m := make(map[int]string) // 建立一個key型態為int,value型態為string的map變數m
fmt.Println(m) // map[]

若map未初始化則為nil,無法加入key及value,也當然無法從中取值,否則編譯時會報錯

var m map[int]string
fmt.Println(m == nil) // true

m[1] = "John" // panic: assignment to entry in nil map
fmt.Println(m)

在map變數後的方括弧內[]設定key,後接賦值符=設定對應的value到map中;
在map變數後的方括弧內[]輸入key可取得對應的value;
若key不存在返回value型態的zero value

m := make(map[int]string)
fmt.Println(m) // map[]
    
m[1] = "John" // 設定key=1的value="John"
m[2] = "Mary" // 設定key=2的value="Mary"
fmt.Println(m) // map[1:John 2:Mary]

fmt.Println(m[1]) // John
fmt.Println(m[2]) // Mary
fmt.Println(m[3]) // "" (empty string)

在map變數輸入key可返回兩個參數,第一個為元素值,第二表示key是否存在。

m := make(map[int]string)
m[1] = "John"

v, ok := m[1]
fmt.Println(v) // John
fmt.Println(ok) // true

v, ok = m[2]
fmt.Println(v) // ""
fmt.Println(ok) // false

也可使用map literal語法直接建立含key-value的map。

m := map[int]string { // map literal
    1: "John",
    2: "Mary",
}
fmt.Println(m) // map[1:John 2:Mary]

使用內建函式delete(m, k)從map變數m移除指定的key k

m := map[int]string {
    1: "John",
    2: "Mary",
}
delete(m, 1) // delete key=1, value="John"
fmt.Println(m) // map[2:Mary]

使用內建函式len(s)取得map的長度。

m := map[int]string {
    1: "John",
    2: "Mary",
}
fmt.Println(len(m)) // 2

map的值型態為自訂的structEmployee

package main

import "fmt"

type Employee struct {
    Id int
    Name string
    Age int8
}

func main() {
    m := map[int]Employee { // key type is int, value type is struct Employee
        1: {1, "John", 33}, // create value Employee by struct literal
        2: {1, "Mary", 28}, 
    }
    fmt.Println(m) // map[1:{1 John 33} 2:{1 Mary 28}]
    fmt.Println(m[3]) // {0  0}
}

使用range走訪map如下,回傳的第一個值k為key,第二個值v為value。

package main

import "fmt"

type Employee struct {
    Id int
    Name string
    Age int8
}

func main() {
    m := map[int]Employee {
        1: {1, "John", 33}, 
        2: {1, "Mary", 28}, 
    }

    for k, v := range m { // use range to for loop map
        fmt.Printf("key=%d, value=%v\n", k, v)
    }
}

執行印出以下:

key=1, value={1 John 33}
key=2, value={1 Mary 28}

若希依放入的順序取出,參考「Golang 依放入順序遍歷map的值」。


沒有留言:

張貼留言