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

yizhihongxing

从浅入深带你掌握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日

相关文章

  • 决战最宅2020 三款55寸电视大屏横向详细图文评测

    很抱歉,由于当前平台的限制,我无法以图文形式提供完整攻略。但是,我可以为您提供一份详细的文字攻略,包含两个示例说明。请参考以下内容: 55寸电视大屏横向详细图文评测攻略 1. 外观设计 电视A:采用超薄边框设计,给人一种高端大气的感觉。背面采用金属材质,提供良好的散热效果。 电视B:边框略厚,但采用金属材质,给人一种坚固耐用的感觉。背面设计简洁,接口布局合理…

    other 2023年10月18日
    00
  • 设置table的边框和单元格td的边框

    设置table的边框和单元格td的边框 在HTML中,表格table是常用的元素之一,而设置table的边框和单元格td的边框对于美化网站的布局和样式有着至关重要的作用。 设置table的边框 使用CSS设置table的边框 可以用CSS来设置table的边框。我们可以通过给table元素添加一个border属性来控制其边框的大小和样式,如下所示: tabl…

    其他 2023年3月28日
    00
  • jenkins忘记密码解决方案

    Jenkins忘记密码解决方案 Jenkins是一个流行的持续集成和交付工具,但是有时候我们忘记了管理员账户密码,该如何重置密码呢?本文将会介绍两种解决方案。 方案一:通过jenkins-cli重置密码 下载并安装jenkins-cli 打开终端并输入以下命令: bash java -jar jenkins-cli.jar -s http://jenkins…

    其他 2023年3月29日
    00
  • C语言深入分析整形数据存储

    C语言深入分析整型数据存储 1. 整型数据存储方式 在C语言中,整形数据可以使用不同的存储方式:有符号数表示正数和负数,无符号数只表示非负数。从存储方式上来讲,整型数据的存储可以分为大端和小端两种方式。 1.1 有符号数的存储 有符号数使用补码表示。最高位表示符号位,0表示正数,1表示负数,剩下的位表示数值。以8位为例,有符号数-1的补码为11111111。…

    other 2023年6月27日
    00
  • centos6下docker的安装和使用

    Centos6下Docker的安装和使用 Docker是一种轻量级的容器技术,可以在单个Linux实例上运行多个Docker容器。本文将为您介绍如何在CentOS6系统上安装和使用Docker。 安装Docker 1. 添加Docker的官方Yum仓库 在CentOS6系统中,您可以使用以下命令添加Docker的官方Yum仓库: sudo tee /etc/…

    其他 2023年3月29日
    00
  • Android SwipeRefreshLayout超详细讲解

    Android SwipeRefreshLayout超详细讲解 SwipeRefreshLayout是一个用于实现下拉刷新功能的Android控件。它可以包裹其他可滚动的控件(如RecyclerView、ListView等),并在用户下拉屏幕时触发刷新操作。下面将详细介绍SwipeRefreshLayout的使用方法。 步骤一:添加依赖 首先,在你的项目的b…

    other 2023年8月20日
    00
  • win7采用指令界面修改运行环境变量的方法

    Win7采用指令界面修改运行环境变量的方法攻略 在Windows 7操作系统中,你可以使用指令界面(Command Prompt)来修改运行环境变量。下面是详细的攻略,包含两个示例说明。 步骤1:打开指令界面 首先,你需要打开指令界面(Command Prompt)。你可以按下Win键+R键,在弹出的运行窗口中输入\”cmd\”,然后点击\”确定\”按钮。这…

    other 2023年8月9日
    00
  • 图说超线程技术(Hyper-Threading Technology)

    下面是关于图说超线程技术的完整攻略,包括超线程技术的原理、优势和两个示例说明。 超线程技术的原理 超线程技术是一种通过在单个物理处理器上模拟多个逻辑处理器来提高处理器性能的技术。它通过在处理器内部创建多个逻辑处理器,使得处理器可以同时执行多个线程,从而提高处理器的利用率和性能。 超线程技术的实现依赖于处理器的硬件支持,包括多个物理处理器核心、多个逻辑处理器、…

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