1、map类型

语法:

var 变量名 map[keytype]valuetype
  • key、value的类型可选:bool、数字、string、指针、管道 、还可以是只包含前面几个类型的接口、结构体、数组
  • key不允许slice、map、function类型

map类型的特点:

  • map集合在使用前一定要make
  • map的key-value是无序
  • key是不可以重复的,如果遇到重复,后一个value会替换前一个value
  • value可以重复的
package main
import "fmt"
func main(){
        //定义map变量:
        var a map[int]string
        //只声明map内存是没有分配空间
        //必须通过make函数进行初始化,才会分配空间:
        a = make(map[int]string,10) //map可以存放10个键值对
        //将键值对存入map中:
        a[20095452] = "张三"
        a[20095387] = "李四"
        a[20097291] = "王五"
        a[20095387] = "朱六"
        a[20096699] = "张三"
        //输出集合
        fmt.Println(a)
}
  • make函数的第二个形参可以不传,不传默认size为1,即可以存放1个键值对

2、map类型变量的定义

package main
import "fmt"
func main(){
        //方式1:
        //定义map变量:
        var a map[int]string
        //只声明map内存是没有分配空间
        //必须通过make函数进行初始化,才会分配空间:
        a = make(map[int]string,10) //map可以存放10个键值对
        //将键值对存入map中:
        a[20095452] = "张三"
        a[20095387] = "李四"
        //输出集合
        fmt.Println(a)


        //方式2:自动类型推断
        b := make(map[int]string)
        b[20095452] = "张三"
        b[20095387] = "李四"
        fmt.Println(b)


        //方式3:
        c := map[int]string{
                20095452 : "张三",
                20098765 : "李四",
        }
        c[20095387] = "王五"
        fmt.Println(c)
}

3、map相关操作

增/改,key不存在就增,存在就改

map["key"]= value

删,存在则删,不存在不操作、不报错

delete(map变量名,"key") 

查:value为返回的value,bool为是否返回 ,要么true 要么false

value ,bool = map[key] 

清空:没有Java中的clear,要么遍历逐个删除,要么make一个新的

//make一个新的,让原来的成为垃圾,被gc回收
map变量名 = make(...xxx)

增删改查的示例:

package main
import "fmt"
func main(){
        //定义map
        b := make(map[int]string)
        //增加:
        b[20095452] = "张三"
        b[20095387] = "李四"
        //修改:
        b[20095452] = "王五"
        //删除:
        delete(b,20095387)
        delete(b,20089546)
        fmt.Println(b)
        //查找:
        value,flag := b[200]
        fmt.Println(value)
        fmt.Println(flag)
}

4、遍历

for-range,注意这时的key是map的key,不是0、1、2的索引

package main
import "fmt"
func main(){
        //定义map
        b := make(map[int]string)
        //增加:
        b[20095452] = "张三"
        b[20095387] = "李四"
        b[20098833] = "王五"
        //获取长度:
        fmt.Println(len(b))
        //遍历:
        for k,v := range b {
                fmt.Printf("key为:%v value为%v \t",k,v)
        }
        fmt.Println("---------------------------")
        
}

map的value又是一个map:a[外层map的key][内层map的key]

a := make(map[string]map[int]string)
//赋值:
a["班级1"] = make(map[int]string,3)
//key为班级1的value是一个map
//这个map里面有三个值
a["班级1"][20096677] = "露露"
a["班级1"][20098833] = "丽丽"
a["班级1"][20097722] = "菲菲"

a["班级2"] = make(map[int]string,3)
a["班级2"][20089911] = "小明"
a["班级2"][20085533] = "小龙"
a["班级2"][20087244] = "小飞"
for k1,v1:= range a {
        fmt.Println(k1)
        for k2,v2:= range v1{
                fmt.Printf("学生学号为:%v 学生姓名为%v \t",k2,v2)
        }
        fmt.Println()
}
04-02 22:51