• golang基础复合类型—map


    一、map结构简介

    1.数组、切片的问题 

    1. names := []string{"Alicy","Bob","Mike","Rita"}
    2. //想要取出Mike的名字,我们需要数一数,Mike在第三个位置
    3. fmt.println(names[2])

    有没有一种结构能够帮助我们快速 的取出数据呢?——map结构(字典结构)

    2.map概念

    Go语言中的字典结构是由键和值构成的,所谓键类似于新华字典的部首或者拼音,可以快速的查询对应的数据。字典的键是不允许重复的,具有唯一性,就像身份证号一样。

    map是一种无序的键值对的集合。

    map最重要的一点是通过key来快速的检索数据,key类似于索引,指向数据的值。

     二、map的创建与初始化

    1.map的创建

    • var map名称 map[键的类型]值的类型
    var m map[int]string //键为int类型,值为string类型
    • map名称 := map[键的类型]值的类型{}
    m := map[int]string{} //键的类型为int,值的类型为string
    • make(map[键的类型]值的类型)
    m := make(map[int]string) //键的类型为int,值的类型为string

    2.初始化

    •  var map名称 map[键的类型]值的类型
    1. //键为int类型,值为string类型
    2. var m map[int]string = map[int]string{1:"Bob",2:"Mike"}
    • map名称 := map[键的类型]值的类型{}
    1. //键的类型为int,值的类型为string
    2. m := map[int]string{1:"Bob",2:"Mike"}
    • make(map[键的类型]值的类型)
    1. //键的类型为int,值的类型为string
    2. m := make(map[int]string)
    3. m[1] = "Mike"
    4. m[2] = "Bob"
    5. m[2] = "Rita" //这种情况下,key如果一致的话,是完成修改,编译不会报错

    三、map 的键与值

    • 通过key获取值
    1. package main
    2. import "fmt"
    3. func main() {
    4. m := map[int]string{1:"Bob",2:"Mike"}
    5. fmt.Println(m[1])
    6. }

     输出:

    Bob

    • 通过key获取值时,判断是否存在
    1. package main
    2. import "fmt"
    3. func main() {
    4. m := map[int]string{1:"Bob",2:"Mike"}
    5. value,ok := m[1]
    6. if ok{
    7. fmt.Println(value)
    8. }else {
    9. fmt.Println("不存在该value")
    10. }
    11. value,ok = m[3]
    12. if ok{
    13. fmt.Println(value)
    14. }else {
    15. fmt.Println("不存在该value")
    16. }
    17. }

    输出:

    Bob
    不存在该value 

    • 通过循环的方式获取值
    1. package main
    2. import (
    3. "fmt"
    4. )
    5. func main() {
    6. m := map[int]string{1:"Bob",2:"Mike"}
    7. for key,value := range m{
    8. fmt.Println(key,":",value)
    9. }
    10. }

    输出:

    1 : Bob
    2 : Mike 

    • 通过key删除某个值
    1. package main
    2. import "fmt"
    3. func main() {
    4. m := map[int]string{1:"Bob",2:"Mike"}
    5. delete(m,2)
    6. fmt.Println(m)
    7. }

    输出: 

    map[1:Bob] 


    三、map作为函数参数

    1.基本语法

    1. //定义一个函数将map传参
    2. func 函数名(map){
    3. 函数体
    4. }
    5. //调用
    6. 函数名(map)
    1. package main
    2. import "fmt"
    3. func main() {
    4. m := map[int]string{1:"Bob",2:"Mike"}
    5. PrintMap(m)
    6. }
    7. func PrintMap(m map[int]string) {
    8. fmt.Println(m)
    9. }

    输出:

    map[1:Bob 2:Mike]

    2.注意事项

    在函数中修改或删除map的值,会影响到原map。

    1. package main
    2. import "fmt"
    3. func main() {
    4. m := map[int]string{1:"Bob",2:"Mike"}
    5. PrintMap(m)
    6. }
    7. func PrintMap(m map[int]string) {
    8. m[2] = "我在函数执行时被修改了..."
    9. fmt.Println(m)
    10. }

    输出:

    map[1:Bob 2:我在函数执行时被修改了...]

    四、map案例 

    有一个英文字符串,统计每个字母出现的次数。

    1. package main
    2. import "fmt"
    3. func main() {
    4. s := "abcdfgghhwraaaaaaaaaaa"
    5. m := CountOfAbc(s)
    6. for key,value := range m{
    7. fmt.Println(key,":出现",value,"次")
    8. }
    9. }
    10. func CountOfAbc(s string) map[string]int {
    11. m := map[string]int{}
    12. for _,value := range s{
    13. //fmt.Println(string(value))
    14. m[string(value)] += 1
    15. }
    16. return m
    17. }

    输出:

    a :出现 12 次
    c :出现 1 次
    h :出现 2 次
    w :出现 1 次
    b :出现 1 次
    d :出现 1 次
    f :出现 1 次
    g :出现 2 次
    r :出现 1 次

  • 相关阅读:
    FreeSWITCH添加自定义endpoint
    Stimulsoft Reports.PHP 2022.4.3 Crack
    微信小程序获取用户头像和昵称完美解决方法(最新方法)
    vlc播放网络数据流
    2024-5-9-从0到1手写配置中心Config之@ConfigurationProperties热更新
    GitLab使用webhook触发Jenkins自动构建
    vue3学习源码笔记(小白入门系列)------provide和 inject 跨层级数据传递原理
    将swagger注解导入apifox的IDEA配置
    D. Jellyfish and Mex - DP
    spring复习03,注解配置管理bean
  • 原文地址:https://blog.csdn.net/weixin_41551445/article/details/126299446