首页 > 其他分享 >golang map的定义与使用

golang map的定义与使用

时间:2023-01-16 17:15:15浏览次数:54  
标签:map 定义 fmt golang Println msg cities string

Map

  map是一堆键值对的未排序集合,比如以身份证号作为唯一键来标识一个人的信息。

  map是引用类型,键必须支持相等运算符(==,!=)类型,比如:int,string,float等内建类型,只含有内建类型的结构体可以作为key。值可以是任意类型,没有限制。

初始化

package main

import (
    "fmt"
)

func main() {
    //第一种方式
    var a map[string]string
    a = make(map[string]string, 10)
    a["no1"] = "松江"
    a["no2"] = "无用"
    fmt.Println(a) //map[no1:松江 no2:无用]

    //第二种方式
    cities := make(map[string]string)
    cities["no1"] = "北京"
    cities["no2"] = "田间"
    cities["no3"] = "上海"
    fmt.Println(cities) //map[no1:北京 no2:田间 no3:上海]

    //第三种方式
    // var heros map[string]string = map[string]string {}
    heroes := map[string]string{
        "hero1": "松江",
        "heros": "武松",
    }
    fmt.Println(heroes) //map[hero1:松江 heros:武松]
}

  map作为参数传递给函数的代价非常的小,一般在32位位的机器上只需要4字段,64位的机器上需要8字节,并且无论是多少数据,在 map 中通过 key 查找对应的 value 非常的快的。

  我们使用 map 的时候,如果事先知道元素所存数量的大小,我们我可能过 make 函数预先给一个合理的数,有助于提升性能,因为事先申请了一大块内存,可以避免后续操作时频繁扩张。

m := make(map[string]string,100) 

增删改查

package main
import (
    "fmt"
)

func main() {
    cities := make(map[string]string)
    cities["no1"] = "太原"
    cities["no2"] = "河南"
    cities["no3"] = "颍川"

    fmt.Println(cities)
    // 1、修改,若key存在则修改,若不存在则增加
    cities["no3"] = "武汉"

    // 2、删除,使用内置函数delete
    delete(cities,"no1")
    //指定key不存在是不会操作也不会报错
    delete(cities,"no4")

    // 3、查找
    val,findStatus := cities["no2"]
    if findStatus {
        fmt.Println("找到了no2,val=",val)
    } else {
        fmt.Println("没有这个key")
    }
    fmt.Println(cities)

    //一次性删除所有的key
    //1.遍历所有的key删除
    //2.重新make一个新的
    cities = make(map[string]string)


    fmt.Println(cities)
}

map遍历

  map结构的数据需使用for-range去遍历。

1、简单遍历

package main

import (
    "fmt"
)

//说明:map的遍历需要使用for-range

func main() {

    cities := make(map[string]string)
    cities["no1"] = "太原"
    cities["no2"] = "河南"
    cities["no3"] = "颍川"
    fmt.Println(cities) //map[no1:太原 no2:河南 no3:颍川]

    for k, v := range cities {
        fmt.Printf("k=%v,v=%v\n", k, v)
    }
    /*
        k=no1,v=太原
        k=no2,v=河南
        k=no3,v=颍川
    */
}

2、复杂遍历

package main

import (
    "fmt"
)

//说明:map的遍历需要使用for-range

func main() {

    //for-range遍历一个较复杂的map
    msg := make(map[string]map[string]string)
    msg["1"] = make(map[string]string)
    msg["1"]["name"] = "tom"
    msg["1"]["age"] = "12"

    msg["2"] = make(map[string]string)
    msg["2"]["name"] = "jack"
    msg["2"]["age"] = "14"

    msg["3"] = make(map[string]string)
    msg["3"]["name"] = "mary"
    msg["3"]["age"] = "15"
    fmt.Println(msg)

    for k1, v1 := range msg {
        fmt.Println("k1=", k1)
        for k2, v2 := range v1 {
            fmt.Printf("\t k2=%v,v2=%v\n", k2, v2)
        }
        fmt.Println()
    }

    fmt.Printf("cities有%d个key-value", len(cities))

    /*
    map[1:map[age:12 name:tom] 2:map[age:14 name:jack] 3:map[age:15 name:mary]]
        k1= 2
             k2=name,v2=jack
             k2=age,v2=14

        k1= 3
             k2=name,v2=mary
             k2=age,v2=15

        k1= 1
             k2=name,v2=tom
             k2=age,v2=12

        cities有3个key-value
    */
}

   Map 是无序的,但是有时候,我们想有序的取到 map 内部的值,所以我们只能通过对key进行排序,然后再通过key的值取对应value 的值。

标签:map,定义,fmt,golang,Println,msg,cities,string
From: https://www.cnblogs.com/wushaoyu/p/17055850.html

相关文章

  • js文件下载自定义命名
    js下载文件时,如果下载地址文件名与实际名称不一致,需要自定义命名,使用a链接时如果涉及跨域,download属性不生效,解决方法:通过axios请求文件,创建a链接下载即可。axios.get(fi......
  • golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf。
      #定义示例类型和变量typeHumanstruct{Namestring}varpeople=Human{Name:"zhangsan"} 普通占位符占位符说明......
  • golang切片
    切片切片并不是数组或者数组指针,切片只是对数组中连续片断的引用,这个片断可以是整个数组,也可以是由起始索引和终止索引标识的数组,所以切片是一个引用类型。//切......
  • Django rest_framework 自定义捕获数据库错误
    自定义捕获错误fromdjango.dbimportDatabaseErrorfromrest_frameworkimportstatusfromrest_framework.responseimportResponsefromrest_framework.viewsimp......
  • MySQL自定义排序ORDER BY FIELD
    在一些场景中,有场景A查询出一个已经排好顺序的id,需要到场景B中查询这些,使用mysql中的WHERE**IN(****),查询出来的结果并不是按照传入的list排序的.但是......
  • 「HTML+CSS」自定义加载动画【049】
    前言Hello!小伙伴!首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~哈哈自我介绍一下昵称:海轰标签:程序猿一只|C++选手|学生简介:因C语言结识编程,随后转入计算......
  • 「HTML+CSS」--自定义加载动画【044】
    前言Hello!小伙伴!首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~哈哈自我介绍一下昵称:海轰标签:程序猿一只|C++选手|学生简介:因C语言结识编程,随后转入计算......
  • 「HTML+CSS」--自定义加载动画【045】
    前言Hello!小伙伴!首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~哈哈自我介绍一下昵称:海轰标签:程序猿一只|C++选手|学生简介:因C语言结识编程,随后转入计算......
  • 「HTML+CSS」--自定义加载动画【043】
    前言Hello!小伙伴!首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~哈哈自我介绍一下昵称:海轰标签:程序猿一只|C++选手|学生简介:因C语言结识编程,随后转入计算......
  • Web安全入门与靶场实战(7)- 利用nmap进行端口扫描
    在获取的靶机IP之后,接下来我们继续扫描这台靶机开放了哪些端口。端口扫描通常是shentou测试要做的第一步操作。为什么要扫描端口呢?因为端口对应了服务,所以扫描端口的目的就......