从浅入深带你掌握Golang数据结构map

从浅入深带你掌握Golang数据结构map

什么是map

map是Golang中非常常用的一种数据结构,类似于其他语言中的哈希表。map是一种无序的键值对数据结构,通过key来快速定位和访问对应的value。map的key可以是任何可比较类型(如int,float等),value可以是任何类型。

map的基本操作

创建map

创建map的方式如下所示:

var m map[key_type]value_type

或

m := make(map[key_type]value_type)

例如:

m := make(map[string]int)

上面的代码创建了一个空的map,key类型为string,value类型为int。

添加元素

向map中添加元素的方式如下所示:

m[key] = value

例如:

m["foo"] = 1

上面的代码向map m中添加了一个key为"foo",value为1的元素。

删除元素

从map中删除元素的方式如下所示:

delete(m, key)

例如:

delete(m, "foo")

上面的代码从map m中删除了key为"foo"的元素。

查找元素

从map中查找元素的方式如下所示:

value, ok := m[key]

例如:

value, ok := m["foo"]

上面的代码从map m中查找key为"foo"的元素,并将其value值赋值给变量value。如果查找成功,ok的值将为true,否则为false。

遍历map

遍历map的方式如下所示:

for key, value := range m {
    // do something with key and value
}

例如:

for k, v := range m {
    fmt.Printf("%s -> %d\n", k, v)
}

上面的代码遍历了map m,并将每个元素的key和value输出。

map的高级操作

map的长度

map的长度可以通过len函数获取,例如:

l := len(m)

嵌套map

map可以嵌套使用,例如:

m := map[string]map[string]int{
    "foo": map[string]int{"bar": 1},
    "baz": map[string]int{"qux": 2},
}

上面的代码创建了一个嵌套map,其中第一层的key为"foo"和"baz",第二层的key分别为"bar"和"qux",value为int类型的数字。

map作为参数传递

map可以作为函数的参数传递,例如:

func someFunc(m map[string]int) {
    // do something with m
}

map的零值

map的零值为nil,表示未初始化。对于未初始化的map,不能直接添加元素,需要通过make函数进行初始化,例如:

var m map[string]int
m = make(map[string]int)

示例说明

示例1:统计字符串中字符出现的次数

func CountChars(s string) map[rune]int {
    m := make(map[rune]int)
    for _, c := range s {
        _, ok := m[c]
        if !ok {
            m[c] = 1
        } else {
            m[c]++
        }
    }
    return m
}

func main() {
    s := "hello world"
    m := CountChars(s)
    for k, v := range m {
        fmt.Printf("%c -> %d\n", k, v)
    }
}

上面的代码统计了字符串s中字符出现的次数,并输出了每个字符和其出现次数。

示例2:开闭合检查器

func CheckOpenClose(s string) bool {
    stack := make([]rune, 0)
    m := map[rune]rune{
        '}': '{',
        ']': '[',
        ')': '(',
    }
    for _, c := range s {
        if _, ok := m[c]; ok {
            if len(stack) == 0 || stack[len(stack)-1] != m[c] {
                return false
            } else {
                stack = stack[:len(stack)-1]
            }
        } else if c == '{' || c == '[' || c == '(' {
            stack = append(stack, c)
        }
    }
    return len(stack) == 0
}

func main() {
    s := "{a[b(c)]d}e"
    fmt.Println(CheckOpenClose(s)) // true
    s1 := "{a[b(c]d}e"
    fmt.Println(CheckOpenClose(s1)) // false
}

上面的代码检查了一个字符串中的符号是否开闭合匹配,如果匹配,则返回true,否则返回false。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:从浅入深带你掌握Golang数据结构map - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 坚果Pro怎么重启?锤子坚果手机强制关机/重启教程

    坚果Pro怎么重启?锤子坚果手机强制关机/重启教程 1. 正常重启 当坚果Pro手机出现异常或需要重启时,可以通过正常重启方式进行操作。 步骤如下: 按下手机侧面的电源键,弹出关机/重启菜单。 选择“重新启动”,然后点击“确定”即可。 示例说明1:当坚果Pro手机应用长时间无响应时,可以使用正常重启方式解决问题。 示例说明2:当坚果Pro手机系统更新后,重启…

    other 2023年6月26日
    00
  • nginx全局配置和性能优化

    Nginx全局配置和性能优化 Nginx是一款高性能的Web服务器和反向代理服务器,已经成为目前互联网中使用最为广泛的Web服务器之一。为了提高Nginx的性能,我们需要进行全局配置和性能优化。 全局配置 我们可以在Nginx配置文件的全局区域中设置一些全局配置选项,这样可以减少在每个虚拟主机中都进行相同配置的麻烦。以下是几个常用的全局配置选项: worke…

    其他 2023年3月28日
    00
  • Android 网络请求框架解析之okhttp与okio

    Android 网络请求框架解析之okhttp与okio 简介 在Android开发中,网络请求是一个非常常见的需求。OkHttp是一个强大的开源网络请求框架,它提供了简洁的API和丰富的功能,使得网络请求变得更加容易和高效。OkHttp底层使用了Okio库来处理数据流,提供了高效的IO操作。 OkHttp的基本用法 下面是使用OkHttp发送GET请求的示…

    other 2023年9月6日
    00
  • oracle插入表数据的4种方式

    Oracle插入表数据的4种方式 在Oracle数据库中插入表数据是一项基本操作,本文将介绍4种常见的方式。 1. 使用INSERT语句 使用INSERT语句可以将数据插入到指定的表中,语法如下: INSERT INTO table_name (column1, column2, …) VALUES (value1, value2, …); 其中,table…

    其他 2023年3月28日
    00
  • 魔兽世界wlk怀旧服鸟德堆什么属性 鸟德属性优先级选择推荐

    魔兽世界WLK怀旧服鸟德堆什么属性 在魔兽世界怀旧服中,如果你选择扮演鸟德这个职业,想要在战斗中表现出色,那么你需要关注以下几个属性:精通、急速、暴击等,下面我将详细讲解。 属性说明 精通 精通是鸟德最为重要的属性之一,因为它可以提升你的宠物造成的伤害和你的治疗效果。一般来说,你需要将大部分的装备属性都分配给精通,甚至可以牺牲一些暴击和急速来提高精通。 急速…

    other 2023年6月27日
    00
  • js随机生成26个大小写字母

    当使用JavaScript编写代码时,可以使用Math.random()函数生成一个0到1之间的随机数。为了生成26个大小写字母,可以使用ASCII码表中的对应值。大写字母的ASCII码值范围是65到90,小写字母的ASCII码值范围是97到122。 以下是生成26个大小写字母的JavaScript代码示例: // 生成随机的大写字母 var upperca…

    other 2023年8月17日
    00
  • anaconda 部署Jupyter Notebook服务器过程详解

    Anaconda 部署 Jupyter Notebook 服务器过程详解 Jupyter Notebook 是一个非常流行的交互式计算环境,可以用于数据分析、机器学习和科学计算等任务。Anaconda 是一个常用的 Python 发行版,它包含了许多常用的科学计算库和工具。在本攻略中,我们将详细讲解如何使用 Anaconda 部署 Jupyter Noteb…

    other 2023年8月3日
    00
  • Inlay技术要求

    下面是 Inlay 技术要求的完整攻略,包括基本原理、实现方法和两个示例说明。 基本原理 Inlay 技术是一种将芯片嵌入 PCB 板中的技术,可以将芯片和 PCB 板集成在一起,从而实现更小、更轻、更高效的电子产品。Inlay 技术的基本原理是将芯片嵌入 PCB 板中,然后通过封装和连接技术将芯片与 PCB 板连接起来。 实现方法 实现 Inlay 技术的…

    other 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部