Go语言基础之map

Go语言基础之map

前言

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

回忆往事

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

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

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

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

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

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语法

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

示例

方式一,声明时赋值

代码

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方式

代码

package main

import "fmt"

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

	var stu2 = make(map[string]string10)
	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

代码

package main

import "fmt"

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

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

只遍历key

package main

import "fmt"

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

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

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

删除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]
}

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

上节回顾

在上节,我们学习了map如何使用。

map有两种方式定义,一种是标准方式,声明时赋值,一种是make。

package main

import "fmt"

func main() {

	var stu1 = map[string]string{
		"Name":   "张三""Age":    "18""height": "188"//每行都要以,结尾,
	}

	stu2:=make(map[string]string10)
	stu2["Name"] = "李四"
	stu2["Age"] = "170"
	stu2["height"] = "109"

	fmt.Println(stu1,stu2)
	//map[Age:18 Name:张三 height:188] map[Age:170 Name:李四 height:109]
}

发现问题

不知道你有没有发现一个问题,我们现在存储的map好像只能存储一个。

应该来说,我应该有个列表,存储着一个个的学生信息。

伪代码:

var student_list = [张三的信息,李四的信息,王五的信息,...]

但是玩了这么久,依然还是一个个单的的信息,这搞得,害。

切片中存储map

我们知道切片,是这样定义的。

var names []string
var names = []string{}
var names = make([]string,0,10)

上述中,列表保存的都是基本类型,字符串了,数字了,等。

来点刺激的,列表中直接存map。

伪代码

var names = []map[string]string{}
//注意:map[string]string{}是切片里面值的类型,这个切片里面的每个值都是map类型

示例代码

package main

import "fmt"

func main() {
	//定义个类型是map的列表
	var names = []map[string]string{}
	var name1 = map[string]string{
		"Name": "张三""Age":  "18"}
	var name2 = map[string]string{
		"Name": "李四""Age":  "22"}
	names = append(names, name1, name2) //向列表中添加map
	fmt.Println(names)                  //[map[Age:18 Name:张三] map[Age:22 Name:李四]]
}

图解

在这里插入图片描述

map中保存切片

在以往的操作中,我们的mapkeyvalue都是一个

那像一个人的爱好了,生活习惯了,等,都不止一个,所以,在map中,map的值(value),应该能保存多个才对。

代码

package main

import "fmt"

func main() {
	//map中,value为切片类型
	var person_hoppy = map[string][]string{}
	person_hoppy["hoppy"] = []string{"吃""喝""拉""撒"}
	fmt.Println(person_hoppy)//map[hoppy:[吃 喝 拉 撒]]
}

图解

在这里插入图片描述

注:在map中,key只能是固定值,因为要通过key找值,所以key不能修改,value可以是任意类型。

总结

上述我们学习了Go基础之map。

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

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

感谢你的观看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值