分享
  1. 首页
  2. 文章

3.2.8Golang的map

寒暄_HX · · 1023 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

总目录:https://www.jianshu.com/p/e406a9bc93a9

Golang - 子目录:https://www.jianshu.com/p/8b3e5b2b4497

map

map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。

map的定义

语法:
map[键数据类型]值数据类型

map类型的变量默认初始值为nil,需要使用make()函数来分配内存。

语法:
make(map[键数据类型]值数据类型, [容量])

map的基本使用

package main
import "fmt"
func main() {
 // 定义一个map 并初始化 长度最好在初始化时就设置好
 scoreMap := make(map[string]int, 8)
 // 添加key-value
 scoreMap["张三"] = 90
 scoreMap["小明"] = 100
 // 输出map
 fmt.Println(scoreMap)
 // 输出map对应的value
 fmt.Println(scoreMap["小明"])
 // 查看map的数据类型
 fmt.Printf("type of a:%T\n", scoreMap)
 // 在初始化时赋值
 userInfo := map[string]string{
 "username": "沙河小王子",
 "password": "123456",
 }
 fmt.Println(userInfo) 
}
----------
map[小明:100 张三:90]
100
type of a:map[string]int
map[password:123456 username:沙河小王子]

判断某个键是否存在

package main
import "fmt"
func main() {
 // 定义一个map 并初始化 长度最好在初始化时就设置好
 scoreMap := make(map[string]int, 8)
 // 添加key-value
 scoreMap["张三"] = 90
 scoreMap["小明"] = 100
 // 判断某个键是否存在
 // 如果key存在ok为true,v为对应的值;不存在ok为false,v为值类型的零值 
 // ok为约定俗成的变量名
 v, ok := scoreMap["张三"]
 if ok {
 fmt.Println(v)
 } else {
 fmt.Println("查无此人")
 }
}
---------
90

map的遍历

Go语言中使用for range遍历map

package main
import "fmt"
func main() {
 // 定义一个map 并初始化 长度最好在初始化时就设置好
 scoreMap := make(map[string]int, 8)
 // 添加key-value
 scoreMap["张三"] = 90
 scoreMap["小明"] = 100
 // 遍历
 for k, v := range scoreMap {
 fmt.Println(k, v)
 }
}
---------
张三 90
小明 100

还有两种特殊的写法:

 // 只遍历key
 for k := range scoreMap {
 fmt.Println(k)
 }
 // 只遍历value
 for _,v := range scoreMap {
 fmt.Println(v)
 }`

按照指定顺序遍历

大体上是提取出key,对key进行排序,然后用排好序的key去读取vlaue。

 // 按照指定顺序遍历map
 rand.Seed(time.Now().UnixNano()) //初始化随机数种子
 var scoreMap = make(map[string]int, 200)
 for i := 0; i < 100; i++ {
 key := fmt.Sprintf("stu%02d", i) //生成stu开头的字符串
 value := rand.Intn(100) //生成0~99的随机整数
 scoreMap[key] = value //写入map
 }
 //取出map中的所有key存入切片keys
 var keys = make([]string, 0, 200)
 for key := range scoreMap {
 keys = append(keys, key) 
 }
 //对切片进行排序
 sort.Strings(keys)
 //按照排序后的key遍历map
 for _, key := range keys {
 fmt.Println(key, scoreMap[key])
 }

删除键值对

使用delete()内建函数从map中删除一组键值对。

语法:
delete(map,key)

package main
import "fmt"
func main() {
 // 定义一个map 并初始化 长度最好在初始化时就设置好
 scoreMap := make(map[string]int, 8)
 // 添加key-value
 scoreMap["张三"] = 90
 scoreMap["小明"] = 100
 delete(scoreMap, "小明")//将小明:100从map中删除
 for k,v := range scoreMap{
 fmt.Println(k, v)
 }
}
---------
张三 90

元素为map的切片

其实是定义一个切片,在数据类型那里使用map的定义格式。
例如:[{k:v},{k:v},{k:v}] 这样的格式

package main
import (
 "fmt"
)
func main() {
 // 值为map的切片
 var mapSlice = make([]map[string]string, 3)
 for index, value := range mapSlice {
 fmt.Printf("index:%d value:%v\n", index, value)
 }
 fmt.Println("after init")
 // 对切片中的map元素进行初始化
 mapSlice[0] = make(map[string]string, 10)
 mapSlice[0]["name"] = "小王子"
 mapSlice[0]["password"] = "123456"
 mapSlice[0]["address"] = "沙河"
 for index, value := range mapSlice {
 fmt.Printf("index:%d value:%v\n", index, value)
 }
}
----------
index:0 value:map[]
index:1 value:map[]
index:2 value:map[]
after init
index:0 value:map[address:沙河 name:小王子 password:123456]
index:1 value:map[]
index:2 value:map[]

value是切片的map

例如:{k:[1,2,3],k:[4,5,6],k:[7,8,9]}

package main
import (
 "fmt"
)
func main() {
 // 值为切片的map
 var sliceMap = make(map[string][]string, 3)
 fmt.Println(sliceMap)
 fmt.Println("after init")
 key := "中国"
 value, ok := sliceMap[key]
 if !ok {
 value = make([]string, 0, 2)
 }
 value = append(value, "北京", "上海")
 sliceMap[key] = value
 fmt.Println(sliceMap)
}
----------
map[]
after init
map[中国:[北京 上海]]

练习题

1.写一个程序,统计一个字符串中每个单词出现的次数。比如:"how do you do"中how=1 do=2 you=1。

package main
import (
 "fmt"
 "strings"
)
func main() {
 // 1.写一个程序,统计一个字符串中每个单词出现的次数。比如:"how do you do"中how=1 do=2 you=1。
 str1 := "how do you do"
 stringMap := make(map[string]int, 3)
 ss := strings.Split(str1, " ")
 for _,key :=range ss{
 stringMap[key] ++
 }
 fmt.Println(stringMap)
}
----------
map[do:2 how:1 you:1]

2.观察下面代码,写出最终的打印结果。

func main() {
 type Map map[string][]int 
 m := make(Map) //实例化了一个map
 s := []int{1, 2} //初始化了一个切片
 s = append(s, 3) //追加一个元素
 fmt.Printf("%+v\n", s)
 m["q1mi"] = s //把切片赋给qimi做value 此时 这个value和s没有关系了。
 s = append(s[:1], s[2:]...) //删除第二个元素
 fmt.Printf("%+v\n", s) //切片会少一个
 fmt.Printf("%+v\n", m["q1mi"]) //但是map不受影响
}
----------
[1 2 3]
[1 3]
[1 2 3]

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:寒暄_HX

查看原文:3.2.8Golang的map

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1023 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏