Golang 的 map,有蠻多小細節要注意的,例如thread safe相關的問題….

map 其實就是一個 key and value 的結構

map

package main

import (
	"fmt"
)

var (
	a map[string]string
)

func main() {
	a = make(map[string]string)
	a["s"] = "say"
	a["b"] = "ball"
	fmt.Println(a)
}

https://play.golang.org/p/iWJwS3_s9sv

或是也能這樣宣告

package main

import (
	"fmt"
)

func main() {
	a := make(map[string]string)
	a["s"] = "say"
	a["b"] = "ball"
	fmt.Println(a)
}

https://play.golang.org/p/KNO5tfeOQjv

或是直接初始化也行

package main

import (
	"fmt"
)

func main() {
	a := map[string]string{
		"s": "say",
		"b": "ball",
	}
	fmt.Println(a)
}

https://play.golang.org/p/-3SzzHugfN4

當然它也可以支援巢狀式宣告

package main

import (
	"fmt"
)

var (
	a map[string]map[string]string
)

func main() {
	a = make(map[string]map[string]string)

	a["s1"] = map[string]string{
		"a1": "apple",
	}

	fmt.Println(a)
}

https://play.golang.org/p/rD4av2oxLe0

golang的 map,並沒有thread safe,但是他在1.9之後有在sync套件中新增另一種型別的map有支援thread safe。

關於如何在golang中,如何安全的存取map,在後面講到gorotuine的時侯會介紹到。