首页 > 其他分享 >map 简单梳理【GO 基础】

map 简单梳理【GO 基础】

时间:2023-10-12 18:45:31浏览次数:44  
标签:map fmt value key GO main scoreMap 梳理

〇、map 简介

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

其中键可以是任何类型,但值必须是可比较的类型(如整数、字符串、布尔值等)。

一、map 的定义和使用

1.1 map 的定义

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

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

make(map[KeyType]ValueType, [cap])
// cap:表示 map 的容量,非必须

1.2 map 的基本使用

map 中的数据都是成对出现的,map 的基本使用示例代码如下:

package main

import "fmt"

func main() {
	scoreMap := make(map[string]int, 8)
	scoreMap["张三"] = 90
	scoreMap["李四"] = 100
	fmt.Println(scoreMap)
	fmt.Println(scoreMap["李四"])
	fmt.Printf("type of scoreMap : %T\n", scoreMap)
	// 声明时直接赋值
	userInfo := map[string]bool{
		"王五": true,
	}
	fmt.Println(userInfo)
	fmt.Printf("type of userInfo : %T\n", userInfo)
}

1.3 判断某个键是否存在

Go 语言中有个判断 map 中键是否存在的特殊写法,格式如下:

value, ok := map[key]
// 若 key 存在,则 ok = true,value 为对应的值,否则 ok = false
package main

import "fmt"

func main() {
	scoreMap := make(map[string]int)
	scoreMap["张三"] = 90
	scoreMap["小明"] = 100
	value, ok := scoreMap["张三"]
	if ok {
		fmt.Println(value)
	} else {
		fmt.Println("查无此人")
	}
	value2, ok := scoreMap["张三1"]
	if ok {
		fmt.Println(value2)
	} else {
		fmt.Println("查无此人")
	}
}

1.4 map 的遍历

Go 语言中使用 for range 遍历 map。

package main

import "fmt"

func main() {
	scoreMap := make(map[string]int)
	scoreMap["张三"] = 90
	scoreMap["李四"] = 100
	scoreMap["王五"] = 60
	for k, v := range scoreMap { // 只想遍历 k 时,v 可省略
		fmt.Println(k, v)
	}
}

注意:遍历 map 时的元素顺序与添加键值对的顺序无关。

1.5 通过 delete 删除键值对

使用 delete() 内建函数从 map 中删除一组键值对,delete() 函数的格式如下:

delete(map, key)
// map 表示要从中删除键值对的 map 对象名
// key 表示要删除的键
package main

import "fmt"

func main() {
	scoreMap := make(map[string]int)
	scoreMap["张三"] = 90
	scoreMap["李四"] = 100
	scoreMap["王五"] = 60
	delete(scoreMap, "李四")
	for k, v := range scoreMap {
		fmt.Println(k, v)
	}
}

1.6 按照指定顺序遍历 map

map 本身是无序的,如果想按照顺序来遍历,可以将全部的 key 取出来自行排序,最后对这个排序后的键列表进行遍历,每次通过键取 map 中的值。如下示例代码:

package main

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

func main() {
	var scoreMap = make(map[string]int, 20)
	for i := 0; i < 10; i++ {
		key := fmt.Sprintf("stu%02d", i) // 生成 stu 开头的字符串
		value := rand.Intn(100)          // 生成 0~99 的随机整数
		scoreMap[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])
	}
}

1.7 元素可以是 map 类型的切片

package main

import (
	"fmt"
)

func main() {
	var mapSlice = make([]map[string]string, 3) // 初始化一个 map 列表,长度为 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) // 初始化第一个切片的值为长度是 10 的 map,然后后续再进行赋值
	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.8 值为切片类型的 map

package main

import (
	"fmt"
)

func main() {
	var sliceMap = make(map[string][]string, 3) // 初始化一个长度为 3 的 map
	fmt.Println(sliceMap)
	fmt.Println("after init")
	key := "中国"
	value, ok := sliceMap[key]
	if !ok {
		value = make([]string, 0, 2)
	}
	value = append(value, "北京", "上海") // 往 value 中添加值
	sliceMap[key] = value
	fmt.Println(sliceMap)
}

参考:http://www.topgoer.com/go%E5%9F%BA%E7%A1%80/Map.html

标签:map,fmt,value,key,GO,main,scoreMap,梳理
From: https://www.cnblogs.com/hnzhengfy/p/Go_map.html

相关文章

  • golang map json 结构体
    要将JSON转换为Go结构体,您可以使用json.Unmarshal()函数。首先,您需要定义一个与JSON数据结构匹配的Go结构体,然后使用json.Unmarshal()将JSON数据解码为该结构体。以下是一个示例:假设有如下JSON数据:{"name":"JohnDoe","age":30,"email":"[email protected]"}......
  • struct 结构体【GO 基础】
    〇、前言虽然Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念,但是可以通过结构体的内嵌,再配合接口,来实现面向对象,甚至具有更高的扩展性和灵活性。那么本文就将详细看下怎么使用结构体。一、结构体的定义和实例化Go语言中的基础数据类型可以表示一些事物的基......
  • RunnerGo UI自动化测试功能使用体验
    首先需要进入官网,RunnerGo支持开源,可以自行下载安装,也可以点击右上角体验企业版按钮快速体验 点击体验企业版进入工作台后可以点击页面上方的UI自动化进入到测试页面 创建元素我们可以在元素管理中创建我们测试时需要的元素 这里我们以一个打开百度搜索的场景,添加了......
  • 动物识别系统python+Django网页界面+TensorFlow算法模型+数据集训练
    一、简介动物识别系统。基于Python+TensorFlow+Django网页框架+ResNet50算法模型实现实现步骤如下:收集多种动物的图片数据集,并整理归类然后使用TensorFlow搭建ResNet50算法模型网络对数据集进行多次迭代训练最后得到一个精度较高的H5模型文件基于训练好的模型,使用Django开......
  • golang之异步队列Asynq
    Asynq[1]是一个Go实现的分布式任务队列和异步处理库,基于redis,类似Ruby的sidekiq[2]和Python的celery[3]。Go生态类似的还有machinery[4]和goworker同时提供一个WebUI asynqmon[5],可以源码形式安装或使用Dockerimage,还可以和Prometheus集成dockerrun--rm--nameasynqmon......
  • 面试官:ConcurrentHashMap 是如何保证线程安全的
    1、前言阅读此篇文章,你需要有以下知识基础Java内存模型,可见性问题CASHashMap底层原理我们知道,在日常开发中使用的HashMap是线程不安全的,而线程安全类HashTable只是简单的在方法上加锁实现线程安全,效率低下,所以在线程安全的环境下我们通常会使用ConcurrentHashMap,但是又为何需要学习......
  • Go接口 - 构建可扩展Go应用
    本文深入探讨了Go语言中接口的概念和实际应用场景。从基础知识如接口的定义和实现,到更复杂的实战应用如解耦与抽象、多态、错误处理、插件架构以及资源管理,文章通过丰富的代码示例和详细的解释,展示了Go接口在软件开发中的强大功能和灵活性。关注【TechLeadCloud】,分享互联网架......
  • 交通标志识别系统python+TensorFlow+算法模型+Django网页+数据集
    一、介绍交通标志识别系统。技术涉及:Python编程语言开发TensorFlow搭建算法模型对数据集进行训练得到一个精度较高的模型文件Django开发网页端界面平台实现对58种交通标志图片进行识别二、效果图片展示三、演示视频and代码视频+代码+介绍:https://s7bacwcxv4.feishu.......
  • It's likely that neither a Result Type nor a Result Map was specified.
    It'slikelythatneitheraResultTypenoraResultMapwasspecified.很可能既没有指定结果类型也没有指定结果映射。出现问题的代码:本段代码功能是查询一张表的全部点击查看代码<mappernamespace="com.ding.dao.RoleDao"><!--用于select查询公用抽取的列-->......
  • 微服务框架之go-zero
    官方文档:  https://go-zero.dev/ [安装]脚手架goctl:goinstallgithub.com/zeromicro/go-zero/tools/goctl@latest 依赖protoc,protoc-gen-go,protoc-grpc-go安装:protoc:下载:https://github.com/protocolbuffers/protobuf/releases/download/v21.11/protoc-21......