Go map相关
source link: http://www.cnblogs.com/Yunya-Cnblogs/p/13758215.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
map
Go
语言中的 map
是一种无序的,基于 key-value
的数据解构,在 Go
语言中 map
是引用类型,因此必须初始化后才能使用。
以下示例将展示如何声明一个 map
类型,以及如何简单使用。
需要注意的是 map
的 cap
可以进行自动扩容,但是我们应该在初始化 map
的时候就给好适当的容量以提高性能。
package main import ( "fmt" ) func main() { // 初始化一个map,key为string类型,value为int类型,容量为10组 var m = make(map[string]int,10) // 进行填充数据 m["first"] = 110 m["second"] = 120 m["last"] = 119 // 取出value fmt.Println(m["first"]) // 110 }
声明填充
在声明 map
时我们就可以对其填充一些数据,这在很多编程语言中都是被允许的, Go
语言中也不例外。
package main import ( "fmt" ) func main() { // 注意,不可指定cap var userInfo = map[string]string{ "userName":"云崖先生", "userAge":"18", "userGender":"male", } fmt.Println(userInfo) // map[userAge:18 userGender:male userName:云崖先生] }
判断key
Go
语言中有个判断 map
中键是否存在的特殊写法,格式如下:
value, ok := map[key]
示例如下:
package main import ( "fmt" ) func main() { // 注意,不可指定cap var userInfo = map[string]string{ "userName":"云崖先生", "userAge":"18", "userGender":"male", } value,ok := userInfo["userHobby"] if ok{ fmt.Println(value) }else{ fmt.Println("没有该key") } fmt.Printf("%v \n",value) // 一堆空格 fmt.Printf("%v \n",ok) // false }
遍历map
遍历 map
时应该使用 range
进行遍历,另外由于 map
中的数据是无序的,所以遍历的时候也是无序的。
package main import ( "fmt" ) func main() { // 注意,不可指定cap var userInfo = map[string]string{ "userName":"云崖先生", "userAge":"18", "userGender":"male", } for key,value := range userInfo{ fmt.Printf("%v-%v \n",key,value) } }
当只想遍历 key
时,可不指定 value
。
顺序遍历
由于 map
是无序的,所以如果我们想使用顺序遍历,则需要将 key
全部提取到一个 slice
中,遍历 slice
取出 map
中的 value
即可。
package main import( "fmt" "sort" ) func main() { m := map[string]string{ "k-2": "第二个", "k-5": "第五个", "k-1": "第一个", "k-4": "第四个", "k-3": "第三个", } slice := make([]string,0,5) // 只能用切片,切片才能append for key := range(m){ slice = append(slice,key) } sort.Strings(slice) // 排序 for _,key := range(slice){ fmt.Println(m[key]) } }
删除元素
使用内建函数 delete()
可删除 map
中的键值对。
delete(map,key)
示例演示:
package main import ( "fmt" ) func main() { // 注意,不可指定cap var userInfo = map[string]string{ "userName":"云崖先生", "userAge":"18", "userGender":"male", } delete(userInfo,"userGender") fmt.Println(userInfo) // map[userAge:18 userName:云崖先生] }
切片的元素是map
切片中的元素可以是 map
package main import ( "fmt" ) func main() { m := map[string]string{ "k-2": "第二个", "k-5": "第五个", "k-1": "第一个", "k-4": "第四个", "k-3": "第三个", } slice := make([]map[string]string, 0, 1) // 该切片内部只能存储map slice = append(slice, m) fmt.Println(slice[0]["k-1"]) fmt.Println(slice[0]["k-2"]) }
map的value是切片
一个切片也可以作为 map
的 value
package main import ( "fmt" ) func main() { // 该map的value必须是slice var sliceMap = make(map[string][]string, 3) var sliceValue = make([]string, 0, 3) sliceValue = append(sliceValue,"slice-1","slice-2","slice-3") sliceMap["first"] = sliceValue fmt.Println(sliceMap) // map[first:[slice-1 slice-2 slice-3]] }
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK