> 技术文档 > 【Golang】Go语言Map数据类型

【Golang】Go语言Map数据类型


Go语言Map数据类型

文章目录

  • Go语言Map数据类型
    • 一、Map
      • 1.1.1、map定义
      • 1.1.2、map的基本使用
      • 1.1.3、判断某个键是否存在
      • 1.1.4、map的遍历
      • 1.1.5、使用delete()函数删除键值对
      • 1.1.6、按照指定顺序遍历map
      • 1.1.7、元素为map类型的切片
      • 1.1.8、值为切片类型的map

一、Map

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

1.1.1、map定义

  • Go语言中map的定义语法如下
map[keytype]valuetype
  • 其中
keytype: 表示键的类型valuetype: 表示值的类型
  • map类型的变量默认初始值为nil,需要使用make()来分配内存。
  • 语法如下
make(map[keytype]valuetype, [cap])
  • 其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其执行一个合适的容量。

1.1.2、map的基本使用

  • map中的数据都是成对出现的,map的基本使用示例代码如下:
func main() {scoreMap := make(map[string]int, 8)scoreMap[\"张三\"] = 90scoreMap[\"小明\"] = 100fmt.Println(scoreMap)fmt.Println(scoreMap[\"小明\"])fmt.Printf(\"tyoe of a:%T\\n\", scoreMap)}
  • 结果如下
map[小明:100 张三:90]100tyoe of a:map[string]int
  • map也支持在声明的时候填充元素,例如
func main() {userInfo := map[string]string{\"username\": \"admin\",\"password\": \"admin@123\",}fmt.Println(userInfo) // map[password:admin@123 username:admin]fmt.Println(userInfo[\"username\"]) // admin fmt.Println(userInfo[\"password\"]) // admin@123}

1.1.3、判断某个键是否存在

  • Go语言中有个判断map中键是否存在的特俗写法,格式如下:
# value: 将会获得这个map的值# ok: 如果key存在那么ok的值就是true否者为falsevalue, ok := map[key]
  • 举个例子:
func main() {userInfo := map[string]string{\"username\": \"admin\",\"password\": \"admin@123\",}// 如果key存在ok为true, v为对应key的值; 不存在ok为false, v为值类型的零值v, ok := userInfo[\"username\"]if ok {fmt.Println(v)} else {fmt.Println(\"查无此人\")}}

1.1.4、map的遍历

  • Go语言中使用for range遍历map
func main() {scoremap := make(map[string]int)scoremap[\"张三\"] = 90scoremap[\"小明\"] = 100scoremap[\"王五\"] = 60for k, v := range scoremap {fmt.Printf(\"key: %s value: %d\\n\", k, v)}}
  • 但我们只想遍历key的时候,可以按照下面的写法:
func main() {scoremap := make(map[string]int)scoremap[\"张三\"] = 90scoremap[\"小明\"] = 100scoremap[\"王五\"] = 60for k := range scoremap {fmt.Printf(k)}}
  • 注意:遍历map时的元素顺序与添加键值对的顺序毫无关系

1.1.5、使用delete()函数删除键值对

  • 使用delete()内建函数从map中删除一组键值对,delete()函数的格式如下:
delete(map, key)
  • 其中
map: 表示要删除键值对的mapkey: 表示要删除的键值对的key
  • 示例代码如下
func main() {scoremap := make(map[string]int)scoremap[\"张三\"] = 90scoremap[\"小明\"] = 100scoremap[\"王五\"] = 60delete(scoremap, \"小明\")for k, v := range scoremap {fmt.Printf(k, v)}}

1.1.6、按照指定顺序遍历map

func main() {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中的所有key存入切片keysvar keys = make([]string, 0, 200)for key := range scoreMap {keys = append(keys, key)}// 对切片进行排序sort.Strings(keys)for _, key := range keys {fmt.Println(key, scoreMap[key])}}

1.1.7、元素为map类型的切片

  • 下面的代码演示了切片中的元素为map类型时的操作
func main() {// 使用make初始化一个map类型的切片var mapSlice = make([]map[string]string, 3)for index, value := range mapSlice {fmt.Printf(\"index: %d value: %v\\n\", index, value)}fmt.Println(\"init data\")// 在mapSlice这个切片的第0个位置, 创建一个容量为10的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)}}

1.1.8、值为切片类型的map

  • 下面的代码演示了map中值为切片类型的操作
func main() {var sliceMap = make(map[string][]string, 3)fmt.Println(sliceMap)fmt.Println(\"init data\")key := \"中国\"value, ok := sliceMap[key]if !ok {value = make([]string, 0, 2)}value = append(value, \"北京\", \"上海\")sliceMap[key] = valuefmt.Println(sliceMap)}