六、Golang中的Map

map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。

1、map定义

语法:

  map[KeyType]ValueType
 KeyType:表示键的类型。

    ValueType:表示键对应的值的类型。

 map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为:

    make(map[KeyType]ValueType, [cap])
注意 :获取 map 的容量不能使用 cap, cap 返回的是数组切片分配的空间大小 , 根本不能用于
map 。要获取 map 的容量,可以用 len 函数。
    infoma := make(map[string]string)
	infoma["saber"] = "卫宫士郎"
	infoma["rider"] = "远坂应"
	fmt.Println(infoma)
	fmt.Println(infoma["saber"])

 

package main

import "fmt"

func main() {
	/*
		值类型 :改变变量副本值的时候,不会改变变量本身的值  (基本数据类型、数组)
		引用类型:改变变量副本值的时候,会改变变量本身的值 (切片、map)
	*/

	//map类型也是引用数据类型

	var userinfo1 = make(map[string]string)
	userinfo1["username"] = "张三"
	userinfo1["age"] = "20"
	userinfo2 := userinfo1

	userinfo2["username"] = "李四"
	fmt.Println(userinfo1)
	fmt.Println(userinfo2)

}

 2、map 基本使用

map 中的数据都是成对出现的,kv键值对的格式。
map 也支持在声明的时候填充元素,例如:
    var infomas = map[string]string{
		"sabar" : "卫宫士郎",
		"archer" : "远坂樱",

	}
	fmt.Println(infomas)

3、判断某个键是否存在 

var infomas = map[string]string{
		"sabar" : "卫宫士郎",
		"archer" : "远坂樱",

	}
	k,check := infomas["sabar"]

	fmt.Println(k,check)
// 如果 key 存在 check为 true,v 为对应的值;
//不存在 ok 为 false,v 为值类型的零值

4、map 的遍历 

	infoma := make(map[string]string)
	infoma["saber"] = "卫宫士郎"
	infoma["rider"] = "远坂应"
	for k,v := range infoma{
		fmt.Printf("key:%v value:%v\n", k, v)
	}

们只想遍历 key 的时候,可以按下面的写法

    infoma := make(map[string]string)
	infoma["saber"] = "卫宫士郎"
	infoma["rider"] = "远坂应"
	for k := range infoma{
		fmt.Printf("key:%v\n", k)
	}

 注意: 遍历 map 时的元素顺序与添加键值对的顺序无关。

5、map的相关操作

1、创建 修改map类型的数据

    var infomas = map[string]string{
		"sabar" : "卫宫士郎",
		"archer" : "远坂樱",
	}
	infomas["sabar"] = "卫宫巨侠"
	fmt.Println(infomas)

2、获取 查找map类型的数据

var infomas = map[string]string{
		"sabar" : "卫宫士郎",
		"archer" : "远坂樱",
	}
	infomas["sabar"] = "卫宫巨侠"
	fmt.Println(infomas["sabar"])

	v,check := infomas["archer"]
	fmt.Println(v,check)

3、删除map数据里面的key以及对于的值

    delete(map, key)  
   map:表示要删除键值对的map

    key:表示要删除的键值对的键  
    var infomas = map[string]string{
		"sabar" : "卫宫士郎",
		"archer" : "远坂樱",
	}
	infomas["sabar"] = "卫宫巨侠"
	// fmt.Println(infomas["sabar"])

	// v,check := infomas["archer"]
	// fmt.Println(v,check)
	delete(infomas,"sabar")
	fmt.Println(infomas)

4、创建元素为 map 类型的切片

	var mapSlice = make([]map[string]string, 2) //这里先定义的是切片的长度以及容量

	//初始化map
	if mapSlice[0] == nil {
		mapSlice[0] = make(map[string]string) //map不初始化的默认值nil,插不进数据
		mapSlice[0]["name"] = "卫宫士郎"
		mapSlice[0]["servant"] = "sabar"
		mapSlice[0]["age"] = "20"
	}
	//定义的map切片的下标1的kv数据\
	if mapSlice[1] == nil {
		mapSlice[1] = make(map[string]string) //map不初始化的默认值nil,插不进数据
		mapSlice[1]["name"] = "远坂樱"
		mapSlice[1]["servant"] = "archer"
		mapSlice[1]["age"] = "19"
	}

	fmt.Println(mapSlice)

这个几点注意避雷:

第一步这里先定义的是切片的长度以及容量

map不初始化的默认值nil,是正常使用不了的,会报错,在判断为nil之后,去初始化,才能往map的kv键值对赋值;

顺便做个for的遍历
    var mapSlice = make([]map[string]string, 2) //这里先定义的是切片的长度以及容量

	//初始化map
	if mapSlice[0] == nil {
		mapSlice[0] = make(map[string]string) //map不初始化的默认值nil,插不进数据
		mapSlice[0]["name"] = "卫宫士郎"
		mapSlice[0]["servant"] = "sabar"
		mapSlice[0]["age"] = "20"
	}
	//定义的map切片的下标1的kv数据\
	if mapSlice[1] == nil {
		mapSlice[1] = make(map[string]string) //map不初始化的默认值nil,插不进数据
		mapSlice[1]["name"] = "远坂樱"
		mapSlice[1]["servant"] = "archer"
		mapSlice[1]["age"] = "19"
	}

	for _, v := range mapSlice {
		for key,val  := range v {
			fmt.Printf("%v--%v\n", key, val)
			
		}
		
	}
 

 5、值为切片类型的 map(和map 类型的切片做区分

	var sliceMap = make(map[string][]string)
	sliceMap["servant"] =[]string{  //相当于map的kv里面的v做了切片类型,k还是字符串类型
		"sabar",
		"rider",
		"archer",
	}
	sliceMap["master"] =[]string{
		"卫宫士郎",
		"远坂应",
		"山天众人",
	}
	for _, v := range sliceMap {
		// fmt.Println(k, v)
		for _, value := range v {
			fmt.Println(value)
		}
	}

 6、基于map中k的排序

思路:将map中的key,通过append写入一个切片,然后调用sort对切片进行排序,然后再利用排序好的切片中的key去依次取map中的value。

package main

import (
	"fmt"
	"sort"
)

func main() {
	//map的排序
	sortMap := make(map[int]int, 10)
	sortMap[9] = 19
	sortMap[2] = 32
	sortMap[1] = 17
	sortMap[3] = 18
	sortMap[4] = 10
	sortMap[6] = 11


	//1、把map的key放在切片里面
	var keySlice []int
	for key, _ := range sortMap {
		keySlice = append(keySlice, key)
	}
	fmt.Println(keySlice) 

	//2、让key进行升序排序
	sort.Ints(keySlice)
	fmt.Println(keySlice)

	//3、循环遍历key输出map的值
	for _, v := range keySlice {
		fmt.Printf("key=%v value=%v\n", v, sortMap[v])
	}


}

 统计单词出现的次数
package main

import (
	"fmt"
	"strings"
)

func main() {
	

	var str = "i am i am archer"
	var strSlice = strings.Split(str, " ") //以”“ 空格分开,这里成了一个切片
	fmt.Println(strSlice)

	var strMap = make(map[string]int)
	for _, v := range strSlice {
		strMap[v]++  //k为字符串,v为int,遍历的时候strMap["遇到一次加一次,也相当于构建map数据]
	}
	fmt.Println(strMap)

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵唯一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值