Go语言——map数据类型
Go语言中提供的映射关系容器为map
,其内部使用散列表(hash)
实现。map是一种无序的基于key-value
的数据结构,Go语言中的map是引用类型,必须初始化才能使用。map类型的变量默认初始值为nil,需要使用make()函数来分配内存
func main() {
people := make(map[string]int, 10) //通过make为map变量分配内存空间
people["张三"] = 18
people["李四"] = 24
people["王二"] = 28
fmt.Printf("type of people : %T\n", people)
fmt.Println(people)
fmt.Println(people["张三"])
fmt.Println(people["张三丰"]) //由于没有key为 “张三丰”的元素,所以输出int型的0值
}
map的遍历通过for range
完成
func main() {
people := make(map[string]int, 10) //通过make为map变量分配内存空间
people["张三"] = 18
people["李四"] = 24
people["王二"] = 28
people["小明"] = 30
for key, value := range people {
fmt.Println(key, value)
}
// 如果 key存在,ok为true,value为key对应的值; 不存在ok为false,value为对应类型的零值
value, ok := people["张三丰"]
if ok {
fmt.Println(value)
} else {
fmt.Println("查无此人")
}
// 只遍历key
for key := range people {
fmt.Println(key)
}
}
可以使用delete()
函数删除某个键值
func main() {
people := make(map[string]int, 10) //通过make为map变量分配内存空间
people["张三"] = 18
people["李四"] = 24
people["王二"] = 28
people["小明"] = 30
delete(people, "张三") // 将 张三:18 从map中删除
for key, value := range people {
fmt.Println(key, value)
}
}
map本身是一种无序的基于key-value
的数据结构,要想顺序遍历map,可以先把map的key存到一个切片,再对切片元素排序,最后遍历切片,用遍历结果作为key访问map,就可以实现map的顺序遍历
func main() {
rand.Seed(time.Now().UnixNano()) //初始化随机数种子
var scoreMap = make(map[string]int, 200)
for i := 0; i < 100; i++ {
key := fmt.Sprintf("stu%02d", i) //生成stu开头的字符串
value := rand.Intn(100) //生成0~99的随机整数
scoreMap[key] = value
}
//取出map中的所有key存入切片keys
var keys = make([]string, 0, 200)
for key := range scoreMap {
keys = append(keys, key)
}
//对切片进行排序
sort.Strings(keys)
//按照排序后的key遍历map
for _, key := range keys {
fmt.Println(key, scoreMap[key])
}
}
切片和map可以互相嵌套,下面代码是切片中的元素为map类型时的操作
func main() {
var mapSlice = make([]map[string]string, 3)
for index, value := range mapSlice {
fmt.Printf("index:%d value:%v\n", index, value)
}
fmt.Println("after init")
// 对切片中的map元素进行初始化
mapSlice[0] = make(map[string]string, 10)
mapSlice[0]["name"] = "小王子"
mapSlice[0]["password"] = "123456"
mapSlice[0]["address"] = "沙河"
for index, value := range mapSlice {
fmt.Printf("index:%d value:%v\n", index, value)
}
}