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

开发 后端
在上述的多个文章中,我们学习了数据类型,数组,切片等帮助我们存储数据。尤其是是切片,可以存储多个东西,并且可以灵活的增删改查。

[[350553]]

 回忆往事

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

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

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

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

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

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) 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

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

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

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

引入map

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

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

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

map基本使用

map语法

方式一,声明时赋值 
var 变量名 = map[key类型][value类型]{ 
    key:value, 
    key:value,//必须使用,结尾,否则会报错 

//方式二,make方式 
var 变量名 = make(map[key类型]value类型, 容量(cap)) 
//如果map是make方式声明的,第二个参数直接就是容量,元素个数是0,没有第三个参数 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

示例

方式一,声明时赋值

代码

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] 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

方式二,make方式

代码

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] 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

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

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

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

遍历map(查)

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

代码

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) 
  } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

只遍历key

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
  } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

修改map的值(改)

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) 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

删除map里面的值

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

代码

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] 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

map取值注意事项

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

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不存在"
  } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

总结

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

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

本文转载自微信公众号「 Go语言进阶学习」,可以通过以下二维码关注。转载本文请联系 Go语言进阶学习公众号。

 

责任编辑:武晓燕 来源: Go语言进阶学习
相关推荐

2022-02-16 10:03:06

对象接口代码

2020-10-22 08:33:22

Go语言

2020-11-11 10:52:54

Go语言C语言

2022-04-27 10:01:43

切片Go封装

2020-12-30 09:04:32

Go语言TCPUDP

2020-10-25 07:33:13

Go语言

2020-12-09 09:59:32

Go语言技术

2020-10-23 08:38:19

Go语言

2021-10-09 07:10:31

Go语言基础

2020-12-27 10:15:44

Go语言channel管道

2021-11-03 10:02:07

Go基础函数

2020-12-07 05:59:02

语言Go接口

2021-10-30 10:43:04

语言Go函数

2021-09-29 10:00:07

Go语言基础

2021-10-13 10:00:52

Go语言基础

2020-10-22 11:15:47

Go语言变量

2021-10-16 10:17:51

Go语言数据类型

2020-12-23 08:39:11

Go语言基础技术

2021-02-20 10:06:14

语言文件操作

2021-01-13 08:40:04

Go语言文件操作
点赞
收藏

51CTO技术栈公众号