go语言基础---Map
Map
map是一种无序的 基于key-value的数据结构,Go语言中的map是引用类型 必须初始化才能使用
定义的语法:map[KeyType]ValueType
初始化: make(map[KeyType]ValueType,[cap])
Map的底层原理: (简单理解)
底层存储方式是stuct的数组,存储的key不能重复,如果key重复将会被覆盖
如何将我们的map存入数组中:
将key进行hash运算(简单理解为将key转换为一个整形数字),然后对数组进行取余数,等到数组的下标值.
问题:可能会出现hash冲突(不同的key通过hash运算得到的数是相同的)
1.线性探测:将冲突的值向后存放,(找个位置存下)
2.拉链存储指针,此数组的值中存放冲突的value指针,形成一个链表
1.map的基本使用
package main
import "fmt"
func main() {
//初始化一个容量为8的map[string]int
scopeMap := make(map[string]int,8)
scopeMap["chenjunde"] = 100
scopeMap["duchao"] = 99
fmt.Println(scopeMap) //map[chenjunde:100 duchao:99]
fmt.Println(scopeMap["chenjunde"]) //100
fmt.Printf("scopeMap type :%T",scopeMap) //scopeMap type :map[string]int
}
2.可以判断某个key是否有对用的value值
package main
import "fmt"
func main() {
scopeMap := make(map[string]int,8)
scopeMap["chenjunde"] = 100
scopeMap["duchao"] = 99
if value ,ok := scopeMap["xiaoshan"] ; ok{
fmt.Println(value)
} else {
fmt.Println("查无此人")
}
}
3.Map的遍历
go语言中使用for range 对Map进行遍历
package main
import "fmt"
func main(){
scoreMap := make(map[string]int)
scoreMap["chenjunde"] = 100
scoreMap["xiaoshan"] = 90
scoreMap["duchao"] = 80
for k , v := range scoreMap{
fmt.Println(k,v)
}
}
输出结果:
chenjunde 100
xiaoshan 90
duchao 80
只想遍历key的时候:
package main
import "fmt"
func main(){
scoreMap := make(map[string]int)
scoreMap["chenjunde"] = 100
scoreMap["xiaoshan"] = 90
scoreMap["duchao"] = 80
for k := range scoreMap{ //只想遍历key的值
fmt.Println(k,v)
}
}
4.delete()函数删除键值对
delete()为go语言内置的函数
delete(map,key)
map:要操作的map
key:要删除的键key
package main
import "fmt"
func main(){
scoreMap := make(map[string]int)
scoreMap["chenjunde"] = 100
scoreMap["xiaoshan"] = 90
scoreMap["duchao"] = 80
delete(scoreMap,"chenjunde") //删除key为"chenjunde"的k-v
for k , v := range scoreMap{
fmt.Println(k,v)
}
}
5.按照指定的顺序遍历map
需求分析:(先写注释)
1.生成容量为100的map[string]int
2.key我们要随机生成100个stu开头数字结尾的字符串,value是随机生成的100以内的数字
3.要求按照key的值有序输出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])
}
}
6.元素为map的切片
package main
import "fmt"
func main(){
//元素为map的切片
var mapSlice = make([]map[string]int,3)
for key , value := range mapSlice {
fmt.Printf("key:%v value:%v",key,value) //key:0 value:map[]
}
//初始化slice里的map
mapSlice[0] = make(map[string]int,10)
mapSlice[0]["chenjunde"] = 100
mapSlice[0]["duchao"] = 99
mapSlice[0]["fengyulong"] = 98
for key,value := range mapSlice {
fmt.Printf("key:%v value:%v",key,value) //key:0 value:map[chenjunde:100 duchao:99 fengyulong:98]
}
}
7.值为切片的map
package main
import "fmt"
func main(){
//值为切片的map
var sliceMap = make(map[string][]string,10)
fmt.Println(sliceMap) //map[]
key := "中国"
value , ok := sliceMap[key]
if !ok {
sliceMap[key] = make([]string,10)
}
value = append(value,"北京","上海")
sliceMap[key] = value
fmt.Println(sliceMap) //map[中国:[北京 上海]]
}