go语言 - map

一、概述

映射(Map)是方便而强大的内建数据结构,它可以关联不同类型的值。其键可以是任何相等性操作符支持的类型, 如整数、浮点数、复数、字符串、指针、接口(只要其动态类型支持相等性判断)、结构以及数组。 切片不能用作映射键,因为它们的相等性还未定义。与切片一样,映射也是引用类型。 若将映射传入函数中,并更改了该映射的内容,则此修改对调用者同样可见。


二、练习

代码如下

package main

import (
	"fmt"
)

/*
	1. 引用类型,哈希表
	2. 键必须是支持相等预算符(== 、 !=)类型,eg: number, string, pointer, array, struct 以及对应的interface
	3. 值可以是任意类型,没有限制
*/

type person struct {
	name string
	age  int
}

func main() {
	//创建map
	m := map[int]person{
		1: {"Ryan.Xu", 26},
		2: {"Huanchao.Xu", 28},
	}

	// fmt.Println(m[1].name)
	fmt.Printf("m‘s value is %v \n", m)

	//遍历map 元素
	for key, val := range m {
		fmt.Printf("key is %d, value is %v \n", key, val)
	}

	//判断key:1 是否存在,存在则打印其value
	if v, ok := m[1]; ok {
		fmt.Println(v)
	}

	//对于不存在的key,直接返回\0, 不会报错
	fmt.Println(m[3])

	//新增map 元素
	m[3] = person{
		"国庆",
		26,
	}
	fmt.Printf("m’s value is %v, m[3]'s value is %v \n", m, m[3])

	//删除map 元素
	delete(m, 3)
	fmt.Printf("m’s value is %v, m[3]'s value is %v \n", m, m[3])

	//获取map 元素个数
	fmt.Printf("m's length is %d \n", len(m))

	//修改map中的value
	modifyValue()

	fmt.Println("\nmodifyValue2: ")
	modifyValue2()

	fmt.Printf("\nCreate Map by make: \n")
	createByMake()

}

type student struct {
	stuNo   string
	stuName string
	stuSex  int
}

func modifyValue() {
	stuMap := map[string]student{
		"10001": {"10001", "stuOne", 1},
		"10002": {"10002", "stuTwo", 0},
		"10003": {"10003", "stuThree", 1},
	}

	//Error: cannot assign to struct field userMap["10002"].stuName
	//userMap["10002"].stuName = "stu_Two"

	stuTemp := stuMap["10002"]
	stuTemp.stuName = "stu_Two"
	stuMap["10002"] = stuTemp

	for k, v := range stuMap {
		fmt.Printf("key is %s, value is %v \n", k, v)
	}
}

//通过指针的形式来修改
func modifyValue2() {
	stuMap := map[string]*student{
		"10001": {"10001", "stuOne", 1},
		"10002": {"10002", "stuTwo", 0},
		"10003": {"10003", "stuThree", 1},
	}
	stuMap["10003"].stuName = "stu_Three"
	for k, v := range stuMap {
		fmt.Printf("key is %s, value is %v \n", k, v)
	}
}

func createByMake() {
	countryCapitalMap := make(map[string]string)
	/* map插入key - value对,各个国家对应的首都 */
	countryCapitalMap["France"] = "Paris"
	countryCapitalMap["Italy"] = "罗马"
	countryCapitalMap["Japan"] = "东京"
	countryCapitalMap["India "] = "新德里"

	for country, capital := range countryCapitalMap {
		fmt.Printf(country+"'s capital is %s \n", capital)
	}

	// for country := range countryCapitalMap {
	// 	fmt.Printf(country+"'s capital is %s \n", countryCapitalMap[country])
	// }

	captial, ok := countryCapitalMap["美国"] //如果确定是真实的,则存在,否则不存在
	if ok {
		fmt.Println("美国的首都是", captial)
	} else {
		fmt.Println("没有查询到美国的首都")
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值