2021.04.17 Go语言学习

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])
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值