前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一篇文章带你了解Go语言基础之map

一篇文章带你了解Go语言基础之map

作者头像
Go进阶者
发布2021-01-22 10:49:35
3510
发布2021-01-22 10:49:35
举报
文章被收录于专栏:Go语言进阶学习

上篇文章中我们学习了Go语言基础中的变量,一篇文章带你了解Go语言基础之变量一篇文章带你了解Go语言基础之数组一篇文章带你了解Go语言基础之字节类型一篇文章带你了解Go语言基础之数据类型。这篇文章我们继续介绍Go语言基础知识,今天跟大家分享的是基础数据类型之map,一起来学习下吧~

前言

Hey,大家好呀,我是星期八,这次咱们继续学习Go基础之map扒。

回忆往事

在上述的多个文章中,我们学习了数据类型数组切片等帮助我们存储数据。

尤其是是切片,可以存储多个东西,并且可以灵活的增删改查。

但是切片仍然有不太方便的地方。

比如学生,一个学生的信息是多个的,例如姓名身高体重年龄等。

如果使用切片,我们可能是这样存储的。

代码语言:javascript
复制
package main

import "fmt"

func main() {
    //学生1
    var stu1 = []string{"张三", "188", "70KG", "18"}
    //学生2
    var stu2 = []string{"李四", "170", "66KG", "17"}
    fmt.Println(stu1)
    fmt.Println(stu2)
}

如果按照目前所接受的知识,只能到这了,我也只能想到这。

但是会有一个明显的缺点,就是我们需要通过下标取值或者修改值

并且我们还得数一下想修改的值的下标在哪个位置,相对来说,不是那么方便。

引入map

map,在Python中叫字典,Java中也叫map,PHP中好像列表就带有map的功能。

map是键值对(key-value)存储结构,是无序的,内部使用哈希(hash)实现,性能很高。

在Go中,map是引用类型,内存图如下。

map基本使用

map语法

代码语言:javascript
复制
方式一,声明时赋值
var 变量名 = map[key类型][value类型]{
    key:value,
    key:value,//必须使用,结尾,否则会报错
}
//方式二,make方式
var 变量名 = make(map[key类型]value类型, 容量(cap))
//如果map是make方式声明的,第二个参数直接就是容量,元素个数是0,没有第三个参数

示例

方式一,声明时赋值

代码

代码语言:javascript
复制
package main

import "fmt"

func main() {
    var stu1 = map[string]string{
        "Name":   "张三",
        "Age":    "18",
        "height": "188", //每行都要以,结尾,
}
    var stu2 = map[string]string{
        "Name":   "李四",
        "Age":    "20",
        "height": "170", //每行都要以,结尾,
}
    fmt.Println(stu1, stu2) 
    //map[Age:18 Name:张三 height:188] map[Age:20 Name:李四 height:170]
}

方式二,make方式

代码

代码语言:javascript
复制
package main

import "fmt"

func main() {
    var stu1 = make(map[string]string,10)
    stu1["Name"] = "张三"
    stu1["Age"] = "18"
    stu1["height"] = "188"

    var stu2 = make(map[string]string,10)
    stu2["Name"] = "李四"
    stu2["Age"] = "20"
    stu2["height"] = "170"
    fmt.Println(stu1,stu2)
    //map[Age:18 Name:张三 height:188] map[Age:20 Name:李四 height:170]
}

ps:关于这两种方式,哪个使用的多。

我的建议是,如果确定有多少个字段,就使用第一种,如果不确定多少个字段,是动态添加的,用第二种。

使用第二种要大概估算好容量,超过会触发自动扩容机制,可能会产生那么一丝丝的性能影响。

遍历map(查)

遍历map,通常只用一种方式for range

代码

代码语言:javascript
复制
package main

import "fmt"

func main() {
    var stu1 = make(map[string]string, 10)
    stu1["Name"] = "张三"
    stu1["Age"] = "18"
    stu1["height"] = "188"

    for key, value := range stu1 {
        //map遍历时,key值键,value是值
        fmt.Println(key, value)
  }
}

只遍历key

代码语言:javascript
复制
package main

import "fmt"

func main() {
    var stu1 = make(map[string]string, 10)
    stu1["Name"] = "张三"
    stu1["Age"] = "18"
    stu1["height"] = "188"

    for key := range stu1 {
        //只遍历key
        fmt.Println(key)
  }
}

修改map的值(改)

代码语言:javascript
复制
package main

import "fmt"

func main() {
    //var stu1 = make(map[string]string, 10)
    //stu1["Name"] = "张三"
    //stu1["Age"] = "18"
    //stu1["height"] = "188"
    //
    //stu1["Name"] = "张三666"//修改
    //fmt.Println(stu1)

    //同上
    var stu1 = map[string]string{
        "Name":   "张三",
        "Age":    "18",
        "height": "188", //每行都要以,结尾,
}
    stu1["Name"] = "张三666"//修改
    fmt.Println(stu1)
}

删除map里面的值

删除map里面的值需要用到delete

代码

代码语言:javascript
复制
package main

import "fmt"

func main() {

    var stu1 = map[string]string{
        "Name":   "张三",
        "Age":    "18",
        "height": "188", //每行都要以,结尾,
}
    fmt.Println(stu1)    //map[Age:18 Name:张三 height:188]
    delete(stu1, "Name") //删除key以及key对应的值
    fmt.Println(stu1)    //map[Age:18 height:188]
}

map取值注意事项

map在取值时,尽可能的判断一下是否key存在

代码语言:javascript
复制
package main

import "fmt"

func main() {

  var stu1 = map[string]string{
    "Name":   "张三",
    "Age":    "18",
    "height": "188", //每行都要以,结尾,
  }
  //result := stu1["Name"]//key存在,没问题
  //fmt.Println(result)//张三
  //result := stu1["Names"]//手一抖,key打错了
  //fmt.Println(result)//结果为空,显然不是太友好

  //取值标准用法
  result, ok := stu1["Name"]
  //如果key存在,ok为true,如果key不存在,ok为false
  fmt.Println(result,ok)//张三 true
  if ok {
    fmt.Println(result)
  } else {
    fmt.Println("key不存在")
  }
}

总结

上述我们学习了Go基础之map。如果在操作过程中有任何问题,记得下面讨论区留言,我们看到会第一时间解决问题。

我是码农星期八,如果觉得还不错,记得动手点赞一下哈,感谢你的观看。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Go语言进阶学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 回忆往事
  • 引入map
  • map基本使用
    • map语法
      • 示例
        • 方式一,声明时赋值
          • 方式二,make方式
          • 遍历map(查)
          • 修改map的值(改)
          • 删除map里面的值
          • map取值注意事项
          • 总结
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档