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]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
。
代码
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
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的值(改)
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]string,10)
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中保存切片
在以往的操作中,我们的map的key和value都是一个值。
那像一个人的爱好了,生活习惯了,等,都不止一个,所以,在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。
如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。
我是码农星期八,如果觉得还不错,记得动手点赞一下哈。
感谢你的观看。