go map增删改查及互换操作整理

爱⌒轻易说出口 提交于 2020-01-27 04:48:20

go map 是一种无序的键值对集合,今天复习一下map结构及其操作,扎实下基础。

江山如此多娇,引无数英雄竞折腰。

目录

map元素查看、遍历与删除

map元素修改(元素value类型为string、int)

map元素修改(元素value类型为struct{}) 

k-v互换操作


map元素查看、遍历与删除

// 初始化一个string值的map并赋值
	m := map[string]string{}
	m["a"] = "value-a"    //新增值
	m["b"] = "value-b"
	fmt.Println(m) // map[a:value-a b:value-b]

	// 查看m里有没有a元素及其值,存在该键值对时exist为true,反之为false
	if v, exist := m["a"];exist {
		fmt.Println("键值存在:", v) // 键值存在: value-a
	} else {
		fmt.Println("key为a的元素不存在。")
	}

	// 遍历m:以两个值获取
	for key, value := range m {
		fmt.Printf("m[%s] = %s \t", key, value)	// m[a] = value-a 	m[b] = value-b
	}

	fmt.Println("")
	// 遍历m:以第二个参数获取,只获取值
	for _, value := range m {
		fmt.Printf("每个元素的值= %s \t", value)	// 每个元素的值= value-a 	每个元素的值= value-b
	}

	fmt.Println("")
	// 遍历m:以第一个参数获取
	for key, _ := range m {
		fmt.Printf("%s = %s \t", key, m[key])	// b = value-b 	a = value-a
	}

    //	删除key为b的元素
	delete(m, "b")
	fmt.Println(m) //map[a:value-a]

map元素修改(元素value类型为string、int)

	// 初始化一个int值的map并赋值
	m2 := map[string]int{}
	m2["A"] = 1
	m2["B"] = 2
	fmt.Println(m2) // map[A:1 B:2]
	m2["A"] = 3
	fmt.Println(m2) // map[A:3 B:2]

	// 初始化一个string值的map并赋值
	m3 := map[string]string{}
	m3["a"] = ""
	m3["b"] = "b"
	fmt.Println(m3) // map[a: b:b]
	m3["a"] = "a"
	fmt.Println(m3) // map[a:a b:b]

map元素修改(元素value类型为struct{}) 

    type data struct {
	    name   string
	    gender string
    }

    // 初始化一个struct值的map并赋值
	m := map[string]data{"x": {"value1", "F"}}
	// 当key不存在map中的时候为新增,当key存在于map的时候为修改,覆盖旧值
	m["y"] = data{"value2", "M"} // 增加新键值对
	m["z"] = data{"value3", "M"} // 增加新键值对
	fmt.Println(m)               // map[x:{value1 F} y:{value2 M}]

	// 注意,map元素是无法取址的,不可以m["x"].name来直接修改
	//m["x"].name = "new" //cannot assign to struct field m["x"].name in map

怎样修改?有以下几种方式

	// 1,修改key为y的值,只修改gender字段
	m["y"] = data{gender: "F"} // map[x:{value1} y:{new value}]
	// 修改key为z的name,构造新结构体赋值
	m["z"] = data{name: "z's name", gender: "F"}
	fmt.Println(m) // map[x:{value1 F} y:{ F} z:{z's name F}]

	// 2,将map的value设为指针类型(结构体较大时最优)
	mm := map[string] *data{}
	mm["a"] = &data{gender:"F",name:"name"}
	fmt.Println(mm["a"])	// &{name F}
	// 修改name字段为name1
	mm["a"].name = "name1"
	fmt.Println(mm["a"])	// &{name1 F}
    // 注意下面一行操作,key为new的元素不存在,此时mm["new"]是空引用,不能.name
    mm["new"].name = "new"	// panic: runtime error: invalid memory address or nil pointer dereference
    // 可以这样来
	mm["new"] = &data{name:"new",gender:"new"}
	for key, value := range mm {fmt.Printf("m[%s] = %s \t", key, value)}	//m[a] = &{name1 F} 	m[new] = &{new new}

	// 3,以第三方变量的方式,如想修改key为x的元素值,原元素为"x": {"value1", "F"},修改F为M
	data := m["x"]
	data.gender = "M"
	m["x"] = data
	fmt.Println(m) // map[x:{value1 M} y:{ F} z:{z's name F}]

k-v互换操作

	m := make(map[string]int)
	m["a"] = 0
	m["b"] = 1
	fmt.Println("互换前:", m) // 互换前: map[a:0 b:1]

	// k-v互换
	m2 := make(map[int]string)
	for key, value := range m {
		m2[value] = key
	}
	fmt.Println("互换后:", m2) // 互换后: map[0:a 1:b]

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!