• Go_map


    1. map的创建和使用

    key不能是引用类型,key要求是不变的,引用类型的地址不变,但是值会改变

    package main
    
    import "fmt"
    
    func main() {
    	/*
    	map:映射,是一种专门用于存储键值对的集合。属于引用类型
    
    	存储特点:
    		A:存储的是无序的键值对
    		B:键不能重复,并且和value值一一对应的。
    				map中的key不能重复,如果重复,那么新的value会覆盖原来的,程序不会报错。
    
    	语法结构:
    		1.创建map
    			var map1 map[key类型]value类型 //nil map,无法直接使用
    
    			var map2 = make(map[key类型]value类型)
    
    			map3 := make(map[key类型]value类型)
                         
           //不写make直接赋值,底层有make
    			var map3 = map[key类型]value类型{key:value,key:value,key:value...}
    
    			map5 := map[key类型]value类型{key:value,key:value,key:value...}
    
    
    		2.添加/修改
    			map[key]=value
    				如果key不存在,就是添加数据
    				如果key存在,就是修改数据
    
    		3.获取
    			map[key]-->value
    
    			value,ok := map[key]
    				根据key获取对应的value
    					如果key存在,value就是对应的数据,ok为true
    					如果key不存在,value就是值类型的默认值,ok为false
    
    		4.删除数据:
    			delete(map,key)
    				如果key存在,就可以直接删除
    				如果key不存在,删除失败,不会报错
    
    		5.长度:
    			len()
    
    
    
    	每种数据类型:
    		int:0
    		float:0.0-->0
    		string:""
    		array:[00000]
    
    		slice:nil
    		map:nil
    
    	 */
    
    	//1.创建map
    	var map1 map[int]string         //没有初始化,nil
    	var map2 = make(map[int]string) //创建
    	var map3 = map[string]int{"Go": 98, "Python": 87, "Java": 79, "Html": 93}
    	fmt.Println(map1) //map[]
    	fmt.Println(map2) //map[]
    	fmt.Println(map3) //map[Go:98 Html:93 Java:79 Python:87]
    
    	fmt.Println(map1 == nil) //true
    	fmt.Println(map2 == nil) //false
    	fmt.Println(map3 == nil) //false
    	//2.nil map
    	if map1 == nil {
    		map1 = make(map[int]string)
    		fmt.Println(map1 == nil) //false
    	}
    	//3.存储键值对到map中
    	//map1[key] = value
    	map1[1] = "hello" //panic: assignment to entry in nil map
    	map1[2] = "world"
    	map1[3] = "memeda"
    	map1[4] = "王二狗"
    	map1[5] = "ruby"
    	map1[6] = "三胖思密达"
    	map1[7] = ""
    
    	//4.获取数据,根据key获取对应的value值
    	//根据key获取对应的value,如果key存在,获取数值,如果key不存在,获取的是value值类型的零值
    	fmt.Println(map1) //map[1:hello 2:world 3:memeda 4:王二狗 5:ruby 6:三胖思密达 7:]
    	fmt.Println(map1[4]) //王二狗
    	fmt.Println(map1[40]) //""
    
    	v1,ok :=map1[40]
    	if ok {
    		fmt.Println("对应的数值是:",v1)
    	}else{
    		fmt.Println("操作的key不存在,获取到的是零值:",v1)
    	}
    
    	//5.修改数据
    	fmt.Println(map1)
    	map1[3] = "如花"
    	fmt.Println(map1)
    
    	//6.删除数据
    	delete(map1,3)
    	fmt.Println(map1)
    	delete(map1,100)
    	fmt.Println(map1)
    
    	//7.长度
    	fmt.Println(len(map1))
    
    
    }

    2. map的遍历

    package main
    
    import (
    	"fmt"
    	"sort"
    )
    
    func main() {
    	/*
    	map的遍历:
    		使用:for range
    
    			数组,切片:index,value
    			map:key,value
    	 */
    	map1 := make(map[int]string)
    	map1[1] = "红孩儿"
    	map1[2] = "小钻风"
    	map1[3] = "白骨精"
    	map1[4] = "白素贞"
    	map1[5] = "金角大王"
    	map1[6] = "王二狗"
    
    	//1.for range遍历map
    	for k, v := range map1 {
    		fmt.Println(k, v)
    	}
    
    	//2.for遍历map
    	for i := 1; i <= len(map1); i++ {
    		fmt.Println(i, "--->", map1[i])
    	}
    	/*
    	1.获取所有的key,-->切片/数组
    	2.进行排序
    	3.遍历key,--->map[key]
    	 */
    	keys := make([]int, 0, len(map1))
    	fmt.Println(keys)
    
    	for k, _ := range map1 {
    		keys = append(keys, k)
    	}
    	fmt.Println(keys)
    
    	//冒泡排序,或者使用sort包下的排序方法
    	sort.Ints(keys)
    	fmt.Println(keys)
    
    	for _, key := range keys {
    		fmt.Println(key, map1[key])
    	}
    
    	s1 := []string{"Apple", "Windows", "Orange", "abc", "王二狗", "acd", "acc"}
    	fmt.Println(s1) //[Apple Windows Orange abc 王二狗 acd acc]
    	sort.Strings(s1)
    	fmt.Println(s1) //[Apple Orange Windows abc acc acd 王二狗]
    }
    

    3. map和slice的结合使用

    package main
    
    import "fmt"
    
    func main() {
    	/*
    	map和slice的结合使用:
    		1.创建map用于存储人的信息
    			name,age,sex,address
    
    		2.每个map存储一个人的信息
    
    		3.将这些map存入到slice中
    
    		4.打印遍历输出
    	 */
    
    	//1.创建map存储第一个人的信息
    	map1 := make(map[string]string)
    	map1["name"] = "王二狗"
    	map1["age"] = "30"
    	map1["sex"] = "男性"
    	map1["address"] = "北京市XX路XX号"
    	fmt.Println(map1) //map[address:北京市XX路XX号 age:30 name:王二狗 sex:男性]
    
    	//2.第二个人
    	map2 := make(map[string]string)
    	map2["name"] = "李小花"
    	map2["age"] = "20"
    	map2["sex"] = "女性"
    	map2["address"] = "上海市。。。"
    	fmt.Println(map2) //map[address:上海市。。。 age:20 name:李小花 sex:女性]
    
    	map3 := map[string]string{"name": "ruby", "age": "30", "sex": "女性", "address": "杭州市"}
    	fmt.Println(map3) //map[address:杭州市 age:30 name:ruby sex:女性]
    
    	//将map存入到slice中
    	s1 := make([]map[string]string, 0, 3)
    	s1 = append(s1, map1)
    	s1 = append(s1, map2)
    	s1 = append(s1, map3)
    
    	//遍历切片
    	for i, val := range s1 {
    		//val :map1,map2,map3
    		fmt.Printf("第 %d 个人的信息是:
    ", i+1)
    		fmt.Printf("	姓名:%s
    ", val["name"])
    		fmt.Printf("	年龄:%s
    ", val["age"])
    		fmt.Printf("	性别:%s
    ", val["sex"])
    		fmt.Printf("	地址:%s
    ", val["address"])
    	}
    }
    /*
    第 1 个人的信息是:
    	姓名:王二狗
    	年龄:30
    	性别:男性
    	地址:北京市XX路XX号
    第 2 个人的信息是:
    	姓名:李小花
    	年龄:20
    	性别:女性
    	地址:上海市。。。
    第 3 个人的信息是:
    	姓名:ruby
    	年龄:30
    	性别:女性
    	地址:杭州市
    */
    

    4. map是引用类型

    package main
    
    import "fmt"
    
    func main() {
    	/*
    	一:数据类型:
    		基本数据类型:int,float,string,bool
    		复合数据类型:array,slice,map,function,pointer,struct。。。
    
    			array:[size]数据类型
    			slice:[]数据类型
    			map:map[key的类型]value的类型
    
    
    	二:存储特点:
    		值类型:int,float,string,bool,array,struct
    		引用类型:slice,map
    
    			make(),slice,map,chan
    
    
    	 */
    
    	map1 := make(map[int]string)
    	map2 := make(map[string]float64)
    	fmt.Printf("%T
    ", map1) //map[int]string
    	fmt.Printf("%T
    ", map2) //map[string]float64
    
    	map3 := make(map[string]map[string]string) //map[string]map[string]string
    	m1 := make(map[string]string)
    	m1["name"] = "王二狗"
    	m1["age"] = "30"
    	m1["salary"] = "3000"
    	map3["hr"] = m1
    
    	m2 := make(map[string]string)
    	m2["name"] = "ruby"
    	m2["age"] = "28"
    	m2["salary"] = "8000"
    	
    	//把一个map赋值给一个map中的键
    	map3["总经理"] = m2
    	fmt.Println("map3", map3)
    	//map3 map[hr:map[age:30 name:王二狗 salary:3000] 总经理:map[age:28 name:ruby salary:8000]]
    
    	map4 := make(map[string]string)
    	map4["王二狗"] = "矮矬穷"
    	map4["李小花"] = "白富美"
    	map4["ruby"] = "住在隔壁"
    	fmt.Println(map4) //map[ruby:住在隔壁 李小花:白富美 王二狗:矮矬穷]
    
    	map5 := map4
    	fmt.Println(map5) //map[ruby:住在隔壁 李小花:白富美 王二狗:矮矬穷]
    
    	map5["王二狗"] = "高富帅"
    	fmt.Println(map4) //map[ruby:住在隔壁 李小花:白富美 王二狗:高富帅]
    	fmt.Println(map5) //map[ruby:住在隔壁 李小花:白富美 王二狗:高富帅]
    
    }
    
  • 相关阅读:
    为什么构造函数不能声明为虚函数,析构函数可以
    _stdcall,_cdecl区别
    C++的dllexport和dllimport
    什么样的代码才是好代码
    苦逼三流小公司程序员这半年找工作经历(3)——选择offer
    c# DataTable、DataSet、DataReader
    C# 定时器
    sql 中如何将返回的记录某一条置顶
    c# devExpress控件 comboBoxEdit,gridControl1,labelcontrol、xtraReports ,ButtonEdit,dateEdit
    c# 公共方法
  • 原文地址:https://www.cnblogs.com/yzg-14/p/12247485.html
Copyright © 2020-2023  润新知