首页 > 其他分享 >Go 快速入门指南 - Map

Go 快速入门指南 - Map

时间:2022-12-22 16:37:12浏览次数:38  
标签:Map 入门 fmt two zero Printf Go main

概述

Map 是一种键值对的无序集合,在其他编程语言中也被称为 字典Hash关联数组

重要的一点是: Map 键 的数据类型必须是可以比较的,例如 stringintfloat64, 具体的类型比较规则后面的章节会讲到,读者可以先使用简单数据类型来进行实验。

Map 值 的数据类型可以是任意的。

语法规则

# 声明
var 变量名 map[键数据类型]值数据类型

# 声明及初始化
var 变量名 = make(map[键数据类型]值数据类型, 长度)   // 长度参数可以省略

获取值/改变值

package main

import "fmt"

func main() {
    var m = make(map[string]int)

    fmt.Printf("Map 长度 = %d\n", len(m))

    m["zero"] = 0
    m["one"] = 1
    m["two"] = 2

    fmt.Printf("Map 长度 = %d\n", len(m))

    fmt.Printf("zero = %T, %v\n", m["zero"], m["zero"])
    fmt.Printf("one = %T, %v\n", m["one"], m["one"])
    fmt.Printf("two = %T, %v\n", m["two"], m["two"])
}

// $ go run main.go
// 输出如下 
/**
  Map 长度 = 0
  Map 长度 = 3
  zero = int, 0
  one = int, 1
  two = int, 2
*/

删除元素

调用 delete() 方法完成。

package main

import "fmt"

func main() {
    var m = make(map[string]int)

    fmt.Printf("Map 长度 = %d\n", len(m))

    m["zero"] = 0
    m["one"] = 1
    m["two"] = 2

    fmt.Printf("Map 长度 = %d\n", len(m))

    delete(m, "one")
    delete(m, "two")

    fmt.Printf("Map 长度 = %d\n", len(m))
}

// $ go run main.go
// 输出如下 
/**
  Map 长度 = 0
  Map 长度 = 3
  Map 长度 = 1
*/

判断元素是否存在

package main

func main() {
    var m = make(map[string]int)

    m["zero"] = 0
    m["one"] = 1
    m["two"] = 2

    if _, ok := m["zero"]; ok {
        println(`m["zero"] 元素存在`)
    }

    delete(m, "zero")

    if _, ok := m["zero"]; !ok {
        println(`m["zero"] 元素不存在`)
    }
}

// $ go run main.go
// 输出如下 
/**
  m["zero"] 元素存在
  m["zero"] 元素不存在
*/

遍历 Map

重要的一点是: Map 遍历是无序的。 所以不能依赖于遍历的顺序,不论是  还是 , 如果需要遍历时永远保持相同的顺序,需要提前将  做排序处理,参考 有序 Map 小节。

package main

import "fmt"

func main() {
    var m = make(map[string]int)

    m["zero"] = 0
    m["one"] = 1
    m["two"] = 2

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

    println("\n遍历 3 次,每次输出的结果可能不一样\n")
    for i := 0; i < 3; i++ {
        for k, v := range m {
            fmt.Printf("key = %s, val = %d\n", k, v)
        }
        fmt.Printf("第 %d 次遍历完成\n\n", i+1)
    }
}

// $ go run main.go
// 输出如下 
/**
  key = zero, val = 0
  key = one, val = 1
  key = two, val = 2

  遍历 3 次,每次输出的结果可能不一样

  key = one, val = 1
  key = two, val = 2
  key = zero, val = 0
  第 1 次遍历完成

  key = zero, val = 0
  key = one, val = 1
  key = two, val = 2
  第 2 次遍历完成

  key = one, val = 1
  key = two, val = 2
  key = zero, val = 0
  第 3 次遍历完成
*/

备注: 你的输出应该和这里不一样,多运行几次,看看是否每次都不一样。

并发不安全

最后要说明的很重要的一点是: Map 不是并发安全的, 也就是说,如果在多个线程中,同时对一个 Map 进行读写,会报错。 互斥锁 提供了一个简单的解决方案,后面会专门写一篇文档来说明如何才能 并发安全

联系我

公众号

标签:Map,入门,fmt,two,zero,Printf,Go,main
From: https://www.cnblogs.com/duanbiaowu/p/16998829.html

相关文章

  • Go 快速入门指南 - make 和 new
    概述new() 函数为数据类型T分配一块内存,初始化为类型T的零值,返回类型为指向数据的指针,可以用于所有数据类型。make() 函数除了为数据类型T分配内存外,还可以指定......
  • Go 快速入门指南 - 有序 Map
    概述Map 的遍历是无序的,这意味着不能依赖遍历的键值顺序。如果想实现Map遍历时顺序永远一致,一个折中的方案时预先给Map的 键 排序,然后根据排序后的键序列遍历Map......
  • Go 快速入门指南 - 变长参数和指针参数
    变长参数在函数的最后一个参数的数据类型之前加上省略号 ... ,表示该参数的数据类型是 变长类型,调用该函数时可以传递任意数量 (0-N) 的该类型的参数。一个函数......
  • Go 快速入门指南 - defer 函数
    概述一个 defer 语句就是一个普通的函数或方法调用。 defer 语句保证了不论是在正常情况下(return返回),还是非正常情况下(发生错误,程序终止),函数或方法都能够执......
  • java入门
    JAVAHelloWorld创建一个文件夹存放代码/java/code新建一个java文件文件后缀名为.javahello.java编写代码publicclassHelloWorld{ publicstaticvoidm......
  • django中间件三个了解的方法、 基于django中间件的功能设计、 cookie与session简介、
    目录django中间件三个了解的方法基于django中间件的功能设计cookie与session简介django操作cookiedjango操作cookiedjango操作sessiondjango中间件三个了解的方法1.proc......
  • GOCVHelper图像处理算法库实例整编
       GOCVHelper主要包含图像处理、图像增强和基础文件处理三个部分。由于前两个部分较具有通用性,而且我在不同项目中都进行了反复使用,为了进一步说明类库内容,这里反过来......
  • Go 快速入门指南 - 环境安装
    概述为了节省篇幅,笔者将常用的3种操作系统对应的安装教程汇总到了一起,读者可以直接选择对应内容阅读。Windows环境搭建下载1. 打开Go官网下载地址(https://go.......
  • Go-18 Golang结构体struct详解
    packagemainimport"fmt"//Golang中的结构体详解typenewIntint//自定义类型typemyInt=int//类型别名typezsIntinttypepersonstruct{ namestr......
  • Nmap扫描原理及用法详解
    一、主机发现1、主机发现原理使用Nmap进行主机发现时,主要是为了找到存活主机,方便我们进行后续测试。主机发现的原理和我们使用的ping命令类似,发送探测包到目标主机,如果收......