Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现。
map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化后才能使用。
map定义语法如下:
map[KeyType]ValueType
其中,
KeyType表示键的类型。
ValueType表示键对应的值的类型。
map类型的变量,默认初始值为nil,需要使用make()函数来分配内存。语法为:
make(map[KeyType]ValueType, [cap])
其中cap表示map的容量,该参数虽然不是必须的,但是我们需要在初始化map的时候为其指定一个合适的容量。
package main
import "fmt"
func main() {
scoreMap := make(map[string]int, 8)
scoreMap["张三"]=90
scoreMap["李四"]=100
fmt.Println(scoreMap) //map[张三:90 李四:100]
fmt.Println(scoreMap["张三"]) //90
fmt.Printf("type of a:%T\n",scoreMap) //type of a:map[string]int
}
package main
import "fmt"
func main() {
userInfo := map[string]string{
"name":"张三",
"passed":"12345",
}
fmt.Println(userInfo)
}
结果:
map[name:张三 passed:12345]
Go语言中判断map中某个键是否存在的特殊写法:
value,ok:=map[key]
package main
import "fmt"
func main() {
userInfo := map[string]string{
"name":"张三",
"passed":"12345",
}
v,ok :=userInfo["name"]
if ok{
fmt.Println(v)
}else{
fmt.Println("查无此人")
}
}
结果:
张三
package main
import "fmt"
func main() {
scoreMap :=make(map[string]int)
scoreMap["张三"]=90
scoreMap["李四"]=100
for k,v :=range scoreMap{
fmt.Println(k,v)
}
//可以只遍历key
for k :=range scoreMap{
fmt.Println(k)
}
}
结果:
李四 100
张三 90
张三
李四
注意:遍历map时,元素顺序与添加键值对的顺序无关。
使用delete()内建函数从map中删除键值对,delete()函数的格式如下:
delete(map,key)
其中,
map表示要删除键值对的map
key表示要删除的键
package main
import "fmt"
func main() {
scoreMap :=make(map[string]int)
scoreMap["张三"]=90
scoreMap["李四"]=100
delete(scoreMap,"张三")
for k,v :=range scoreMap{
fmt.Println(k,v)
}
}
结果:
李四 100
package main
import (
"fmt"
"math/rand"
"sort"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())//初始化随机数种子
var scoreMap = make(map[string]int,200)
for i:=0;i<10;i++{
key := fmt.Sprintf("stu%02d",i)//生成stu开头的字符串
value := rand.Intn(100)//生成0-99的随机整数
scoreMap[key]=value
}
fmt.Println(scoreMap)
//取出map中所有的key,存入切片keys
var keys =make([]string,0,200)
for key :=range scoreMap{
keys=append(keys,key)
}
sort.Strings(keys)
for _,value :=range keys{
fmt.Println(scoreMap[value])
}
}
结果:
map[stu00:6 stu01:77 stu02:27 stu03:98 stu04:78 stu05:90 stu06:23 stu07:99 stu08:35 stu09:72]
6
77
27
98
78
90
23
99
35
72
package main
import "fmt"
func main() {
var mapSlice = make([]map[string]string, 3)
for index, value := range mapSlice {
fmt.Printf("index:%d value:%v\n", index, value)
}
mapSlice[0] = make(map[string]string, 10)
mapSlice[0]["name"] = "张三"
mapSlice[0]["passwd"] = "123"
for index, value := range mapSlice {
fmt.Printf("index:%d value:%v\n", index, value)
}
}
结果:
index:0 value:map[]
index:1 value:map[]
index:2 value:map[]
index:0 value:map[name:张三 passwd:123]
index:1 value:map[]
index:2 value:map[]
package main
import "fmt"
func main() {
var sliceMap = make(map[string][]string,3)
fmt.Println(sliceMap) //map[]
key := "中国"
value,ok :=sliceMap[key]
if !ok{
value=make([]string,3)
}
value=append(value,"北京","上海")
sliceMap[key]=value
fmt.Println(sliceMap)//map[中国:[ 北京 上海]]
}
写一个程序,统计一个字符串中每个单词出现的次数。比如:”how do you do”中how=1 do=2 you=1。
package main
import (
"fmt"
"strings"
)
func main() {
var str = "how do you do"
var mymap = make(map[string]int)
li :=strings.Split(str," ")
for _,key := range li{
_,ok:=mymap[key]
if !ok{
mymap[key]=1
}else{
mymap[key]+=1
}
}
fmt.Println(mymap)
}
结果:
map[do:2 how:1 you:1]