iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 9
1
Modern Web

從無到有,使用 Go 開發應用程式系列 第 9

Map Type

許多語言都有提供 key-value 存放方法的 map 結構, Go 使用內建型態 map 實作。

map 型態的表示方法為: map[keyType]valueTypemap 是關鍵字, keyType 必須是可比較(Comparable)的型態,如 stringint 等, valueType 則是內容形態。

建立

建立 Map 資料型態也是用 make ,設定與取值的方法跟大部分的語言(如 PHP )都很像,範例如下:

package main

import "fmt"

func main() {
	score := make(map[string]int)

	fmt.Println(score)  // map[]
	
	score["Miles"] = 80
	score["Chou"] = 60
	
	fmt.Println(score)          // map[Miles:80 Chou:60]
	fmt.Println(score["Miles"]) // 80
	fmt.Println(score["Chou"])  // 60
}

如果有初值的話,設定的方法很像 JSON :

package main

import "fmt"

func main() {
	score := map[string]int{
		"Miles": 80,
		"Chou": 60,
	}

	fmt.Println(score)  // map[]

	score["Miles"] = 80
	score["Chou"] = 60

	fmt.Println(score)          // map[Miles:80 Chou:60]
	fmt.Println(score["Miles"]) // 80
	fmt.Println(score["Chou"])  // 60
}

值得一提的是,宣告值最後一行 "Chou": 60, 的逗號是必要要加的。

這個寫法如果不給初值的話,就會跟使用 make 方法結果一樣:

score := make(map[string]int)

score := map[string]int{}

mapslice 一樣是使用參考,比方說:

package main

import "fmt"

func main() {
	score := map[string]int{
		"Miles": 80,
		"Chou": 60,
	}

	ref := score

	fmt.Println(score)          // map[Miles:80 Chou:60]
	fmt.Println(ref)            // map[Miles:80 Chou:60]

	score["Someone"] = 0

	fmt.Println(score)          // map[Chou:60 Someone:0 Miles:80]
	fmt.Println(ref)            // map[Someone:0 Miles:80 Chou:60]
}

試了幾次,它的順序應該是不固定的。

操作

取值使用 [] 指定 key ,事實上它會回傳兩個值,如果 key 存在,會回傳值與 true ; key 不存在則回傳零值與 false :

package main

import "fmt"

func main() {
	score := map[string]int{
		"Miles": 80,
		"Chou": 60,
	}

	var value int
	var ok bool

    value, ok = score["Miles"]

	fmt.Println(value)     // 80
	fmt.Println(ok)        // true

    value, ok = score["Nobody"]

	fmt.Println(value)     // 0
	fmt.Println(ok)        // false
}

移除 key 使用 delete 函式:

package main

import "fmt"

func main() {
	score := map[string]int{
		"Miles": 80,
	}

	var value int
	var ok bool

    value, ok = score["Miles"]

	fmt.Println(value)     // 80
	fmt.Println(ok)        // true

    delete(score, "Miles")
	value, ok = score["Miles"]

	fmt.Println(value)     // 0
	fmt.Println(ok)        // false
}

參考資料


上一篇
Slice Type
下一篇
Function declarations
系列文
從無到有,使用 Go 開發應用程式30

尚未有邦友留言

立即登入留言