2021.04.17 Go语言学习
map
map是一种无序的基于key-value
的数据结构,Go语言中的map是引用类型,必须初始化才能使用。
map[key]valueType
- key:键的类型
- valueType:键对应的值得类型。
由于需要make动态分配内存,语法:
make (make[key]ValueType,[cap])
- key:键的类型
- valueType:键对应的值得类型。
- cap:map得容量。该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。
使用
map中的数据都是成对出现的,map的基本使用示例代码如下:
func main() {
scoreMap := make(map[string]int, 8)
scoreMap["张三"] = 90
scoreMap["小明"] = 100
fmt.Println(scoreMap)
fmt.Println(scoreMap["小明"])
fmt.Printf("type of a:%T\n", scoreMap)
}
输出:
map[小明:100 张三:90]
100
type of a:map[string]int
map也支持在声明的时候填充元素,例如:
func main() {
userInfo := map[string]string{
"username": "沙河小王子",
"password": "123456",
}
fmt.Println(userInfo) //
}
判断某个键是否存在
使用如下方法:
value, ok := map[key]
例子:
m1["年龄"] = 20
m1["ID"] = 11231415125
fmt.Println(m1)
fmt.Println(m1["ID"])
value, ok := m1["aaa"]
if !ok {
fmt.Println("chawuci")
}else {
fmt.Println("value",value)
}
map的遍历
for range!!!
//map遍历
for i, v := range m1 {
fmt.Println(i,v)
}
//只遍历key
for k := range m1 {
fmt.Println(k)
}
//只遍历value
for i := range m1 {
fmt.Println(i)
}
delete()函数
delete()
内建函数从map中删除一组键值对。
delete(map, key)
- map:表示要删除键值对的map
- key:表示要删除的键值对的键
func main(){
scoreMap := make(map[string]int)
scoreMap["张三"] = 90
scoreMap["小明"] = 100
scoreMap["娜扎"] = 60
delete(scoreMap, "小明")//将小明:100从map中删除
for k,v := range scoreMap{
fmt.Println(k, v)
}
}
元素为map类型的切片
这个可以理解为在切片里面,各个元素得类型是map。
例如:
var a = make([]map[string]int,3)
值为切片类型的map
这个可以理解为在map函数里面key值是切片。
例如:
var a1 = make(map[string][]int,3)
元素为map类型的切片与值为切片类型的map判断
因为我对于这两个看的确实有点花(脑子不好使),所以找到了个方便记忆得办法。
先看如下:
元素为map类型的切片:
var a = make([]map[string]int,3)
值为切片类型的map:
var a1 = make(map[string][]int,3)
之前就有学过,切片得格式是 var name []T
, 所以在判断得时候可以直接根据切片得格式判断是什么类型的map。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GdtiUz9D-1618666392424)(C:\Users\85431\AppData\Roaming\Typora\typora-user-images\image-20210417211459342.png)]
练习
package main
import (
"fmt"
"math/rand"
"sort"
"time"
)
//func main() {
//
// rand.Seed(time.Now().UnixNano()) //建立一个随机时间种子
//
// var scoreMap = make(map[string]int,200) //定义了一个变量名为scoreMap的变量,且开辟了一块内存空间,容量为200
//
// for i := 0; i < 100; i++ {
//
// key := fmt.Sprintf("sta%02d",i) //做一个循环,scoreMap中的key值遍历一下
// value := rand.Intn(100)//生成0~99的随机整数
// scoreMap[key] = value//key对应的随机数赋值给key
//
//
// }
//
// //由于map没办法直接讲key和value值存入,所以我们需要先将map中的所有key存入到切片keys中
//
// var 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])
// }
//}
func main() {
rand.Seed(time.Now().UnixNano()) //初始化随机数种子
var scoreMap = make(map[string]int, 200)//定义了一个变量名为scoreMap的变量,且开辟了一块内存空间,容量为200
for i := 0; i < 100; i++ {
key := fmt.Sprintf("stu%02d", i) //做一个循环,scoreMap中的key值遍历一下
value := rand.Intn(100) //生成0~99的随机整数
scoreMap[key] = value
}
//由于map没办法直接讲key和value值存入,所以我们需要先将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])
}
}