前言hey,大家好呀,我是星期八,这次咱们继续学习go基础之map扒。
回忆往事在上述的多个文章中,我们学习了数据类型,数组,切片等帮助我们存储数据。
尤其是是切片,可以存储多个东西,并且可以灵活的增删改查。
但是切片仍然有不太方便的地方。
比如学生,一个学生的信息是多个的,例如姓名,身高,体重,年龄等。
如果使用切片,我们可能是这样存储的。
package mainimport "fmt"func main() { //学生1 var stu1 = []string{"张三", "188", "70kg", "18"} //学生2 var stu2 = []string{"李四", "170", "66kg", "17"} fmt.println(stu1) fmt.println(stu2)}
如果按照目前所接受的知识,只能到这了,我也只能想到这。
但是会有一个明显的缺点,就是我们需要通过下标取值或者修改值。
并且我们还得数一下想修改的值的下标在哪个位置,相对来说,不是那么方便。
引入mapmap,在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 mainimport "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 mainimport "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 mainimport "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 mainimport "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 mainimport "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 mainimport "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 mainimport "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。如果在操作过程中有任何问题,记得下面讨论区留言,我们看到会第一时间解决问题。
以上就是一篇文章带你了解go语言基础之map的详细内容。