日拱一足系列---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.生成容量为100map[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[中国:[北京 上海]]
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值