5

Go语言学习——map - PENGJUNQIAO

 2 years ago
source link: https://www.cnblogs.com/QiaoPengjun/p/16216733.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Go语言学习——map

  • 映射关系容器 内部使用散列表(hash)实现
  • map是引用类型 必须初始化才能使用
  • 无序的基于key-value的数据结构

map定义

map的定义语法:

map[KeyType]ValueType
  • KeyType:表示键的类型。
  • ValueType:表示键对应的值的类型。

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

make(map[KeyType]ValueType, [cap])

其中cap表示map的容量,该参数不是必须的,但是在初始化map的时候应该为其指定一个合适的容量

map基本使用

判断某个键是否存在

判断map中键是否存在 :

value, ok := map[key]

map的遍历

使用for range遍历map

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

delete()格式:

delete(map, key)
  • map:表示要删除键值对的map
  • key:表示要删除的键值对的键

go doc builtin.delete 查看文档

package main

import "fmt"

// map

func main(){
	var m1 map[string]int
	fmt.Println(m1==nil) // 还没有初始化(没有在内存中开辟空间)
	m1 = make(map[string]int, 10) // 要估算号该map容量,避免在程序运行期间再动态扩容
	m1["理想"] = 18
	m1["李时珍"] = 35
	fmt.Println(m1)
	fmt.Println(m1["理想"])
	// 约定成俗用OK接收返回的布尔值
	fmt.Println(m1["貂蝉"]) // 0 如果不存在这个key拿到对应值类型的零值
	value, ok := m1["貂蝉"]
	if !ok {
		fmt.Println("查无此key")
	} else {
		fmt.Println(value)
	}

	// map的遍历
	for k, v := range m1 {
		fmt.Println(k, v)
	}
	// 遍历key
	for k := range m1 {
		fmt.Println(k)
	}
	// 只遍历value
	for _, v := range m1 {
		fmt.Println(v)
	}
	// 删除
	delete(m1, "李时珍")
	fmt.Println(m1)
	delete(m1, "李白") // 删除不存在的key
}

按照指定顺序遍历map

package main

import (
	"fmt"
	"math/rand"
	"sort"
	"time"
)

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
	}
	fmt.Println(scoreMap)
	//取出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])
	}
}

元素为map类型的切片

值为切片类型的map

一定要初始化

package main

import "fmt"

// map和slice组合

func main(){
	// 元素类型为map的切片
	// var s1 = make([]map[int]string, 0, 10) // 长度为0 内部没有元素
	// var s1 = make([]map[int]string, 1, 10)
	var s1 = make([]map[int]string, 10, 10)
	// 没有对内部的map做初始化
	// s1[0][100] = "A"
	s1[0] = make(map[int]string, 1)
	s1[0][10] = "泰山"
	// fmt.Println(s1) // index out of range [0] with length 0
	// fmt.Println(s1) // panic: assignment to entry in nil map
	fmt.Println(s1) // [map[10:泰山] map[] map[] map[] map[] map[] map[] map[] map[] map[]]

	// 值为切片类型的map
	var m1 = make(map[string][]int, 10)
	m1["北京"] = []int{10, 20, 30}
	fmt.Println(m1)
}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK