跳转到主要内容

标签(标签)

资源精选(342) Go开发(108) Go语言(103) Go(99) angular(82) LLM(75) 大语言模型(63) 人工智能(53) 前端开发(50) LangChain(43) golang(43) 机器学习(39) Go工程师(38) Go程序员(38) Go开发者(36) React(33) Go基础(29) Python(24) Vue(22) Web开发(20) Web技术(19) 精选资源(19) 深度学习(19) Java(18) ChatGTP(17) Cookie(16) android(16) 前端框架(13) JavaScript(13) Next.js(12) 安卓(11) 聊天机器人(10) typescript(10) 资料精选(10) NLP(10) 第三方Cookie(9) Redwoodjs(9) LLMOps(9) Go语言中级开发(9) 自然语言处理(9) PostgreSQL(9) 区块链(9) mlops(9) 安全(9) 全栈开发(8) ChatGPT(8) OpenAI(8) Linux(8) AI(8) GraphQL(8) iOS(8) 软件架构(7) Go语言高级开发(7) AWS(7) C++(7) 数据科学(7) whisper(6) Prisma(6) 隐私保护(6) RAG(6) JSON(6) DevOps(6) 数据可视化(6) wasm(6) 计算机视觉(6) 算法(6) Rust(6) 微服务(6) 隐私沙盒(5) FedCM(5) 语音识别(5) Angular开发(5) 快速应用开发(5) 提示工程(5) Agent(5) LLaMA(5) 低代码开发(5) Go测试(5) gorm(5) REST API(5) 推荐系统(5) WebAssembly(5) GameDev(5) CMS(5) CSS(5) machine-learning(5) 机器人(5) 游戏开发(5) Blockchain(5) Web安全(5) Kotlin(5) 低代码平台(5) 机器学习资源(5) Go资源(5) Nodejs(5) PHP(5) Swift(5) 智能体(4) devin(4) Blitz(4) javascript框架(4) Redwood(4) GDPR(4) 生成式人工智能(4) Angular16(4) Alpaca(4) 编程语言(4) SAML(4) JWT(4) JSON处理(4) Go并发(4) kafka(4) 移动开发(4) 移动应用(4) security(4) 隐私(4) spring-boot(4) 物联网(4) nextjs(4) 网络安全(4) API(4) Ruby(4) 信息安全(4) flutter(4) 专家智能体(3) Chrome(3) CHIPS(3) 3PC(3) SSE(3) 人工智能软件工程师(3) LLM Agent(3) Remix(3) Ubuntu(3) GPT4All(3) 软件开发(3) 问答系统(3) 开发工具(3) 最佳实践(3) RxJS(3) SSR(3) Node.js(3) Dolly(3) 移动应用开发(3) 低代码(3) IAM(3) Web框架(3) CORS(3) 基准测试(3) Go语言数据库开发(3) Oauth2(3) 并发(3) 主题(3) Theme(3) earth(3) nginx(3) 软件工程(3) azure(3) keycloak(3) 生产力工具(3) gpt3(3) 工作流(3) C(3) jupyter(3) 认证(3) prometheus(3) GAN(3) Spring(3) 逆向工程(3) 应用安全(3) Docker(3) Django(3) R(3) .NET(3) 大数据(3) Hacking(3) 渗透测试(3) C++资源(3) Mac(3) 微信小程序(3) Python资源(3) JHipster(3) 大型语言模型(2) 语言模型(2) 可穿戴设备(2) JDK(2) SQL(2) Apache(2) Hashicorp Vault(2) Spring Cloud Vault(2) Go语言Web开发(2) Go测试工程师(2) WebSocket(2) 容器化(2) AES(2) 加密(2) 输入验证(2) ORM(2) Fiber(2) Postgres(2) Gorilla Mux(2) Go数据库开发(2) 模块(2) 泛型(2) 指针(2) HTTP(2) PostgreSQL开发(2) Vault(2) K8s(2) Spring boot(2) R语言(2) 深度学习资源(2) 半监督学习(2) semi-supervised-learning(2) architecture(2) 普罗米修斯(2) 嵌入模型(2) productivity(2) 编码(2) Qt(2) 前端(2) Rust语言(2) NeRF(2) 神经辐射场(2) 元宇宙(2) CPP(2) 数据分析(2) spark(2) 流处理(2) Ionic(2) 人体姿势估计(2) human-pose-estimation(2) 视频处理(2) deep-learning(2) kotlin语言(2) kotlin开发(2) burp(2) Chatbot(2) npm(2) quantum(2) OCR(2) 游戏(2) game(2) 内容管理系统(2) MySQL(2) python-books(2) pentest(2) opengl(2) IDE(2) 漏洞赏金(2) Web(2) 知识图谱(2) PyTorch(2) 数据库(2) reverse-engineering(2) 数据工程(2) swift开发(2) rest(2) robotics(2) ios-animation(2) 知识蒸馏(2) 安卓开发(2) nestjs(2) solidity(2) 爬虫(2) 面试(2) 容器(2) C++精选(2) 人工智能资源(2) Machine Learning(2) 备忘单(2) 编程书籍(2) angular资源(2) 速查表(2) cheatsheets(2) SecOps(2) mlops资源(2) R资源(2) DDD(2) 架构设计模式(2) 量化(2) Hacking资源(2) 强化学习(2) flask(2) 设计(2) 性能(2) Sysadmin(2) 系统管理员(2) Java资源(2) 机器学习精选(2) android资源(2) android-UI(2) Mac资源(2) iOS资源(2) Vue资源(2) flutter资源(2) JavaScript精选(2) JavaScript资源(2) Rust开发(2) deeplearning(2) RAD(2)

在本教程中,我们将研究Go中的Map以及如何使用它们来统治世界!

我们将涵盖您需要了解的有关Map的所有内容,以便在您自己的 Go 应用程序中开始使用它们。我们将研究您在 Go 中与Map交互的所有各种方式,在本教程结束时,您将成为使用它们的大师。

Map数据结构


当您需要非常快速的键值查找时,映射是一种非常有用的数据结构。它们的使用方式非常多样化,无论使用何种底层语言,它们都是任何程序员的宝贵工具。

Go 中的 Map 可以被认为相当于 Python 中的 dict 或 Java 中的 HashMap。

Map基本语法


Go 中的映射可以使用 map 关键字后跟键类型和值类型来定义。这些类型可以是 Go 支持的任何基本类型,您可以在 Go 中使用获取Map类型的 make 关键字初始化新Map。

注意:make 内置函数需要一个可选的第二个容量参数,但是对于 Go 中的Map,这将被忽略,因为Map会自动增长和缩小

// a map of string to int which has
// no set capacity
mymap := make(map[string]int)

// a map of bool to int which has a 
// set capacity of 2
boolmap := make(map[bool]int)

一旦我们初始化了Map,您可以使用它们各自的值在Map中设置键,如下所示:

mymap["mykey"] = 10
fmt.Println(mymap["mykey"]) // prints out 10


迭代键和值


在从 map 中检索值时,我们可以使用 range 关键字并像普通数组或切片一样循环键和值:

for key, value := range mymap {
    fmt.Println(key)
    fmt.Println(value)
}


运行此命令将随后打印出此 mymap 映射中包含的所有键及其后续值。

如果您需要从给定映射中提取所有键,则可以使用此循环来检索所有键,然后将它们附加到键数组中。

var keyArray []string

for key := range mymap {
    keyArray = append(keyArray, key)
}

删除Map中的元素


为了从Map中删除项目,我们可以使用内置的 delete 函数,该函数接受一个 map[key] 键,然后尝试从Map中删除给定的值。如果映射中不存在该键,则删除调用是无操作的,这实际上意味着它什么也不做。

mymap["mykey"] = 1
fmt.Println(mymap["mykey"])
delete(mymap["mykey"])
fmt.Println("Value deleted from map")


将字符串映射到接口


Go 中的映射不仅可以用于将基本类型映射到基本类型。在更复杂的程序中,您可能需要映射字符串来表示接口。

例如,您想将传入的 HTTP 请求 UUID 映射到应用程序中的给定接口。这将允许您根据映射的 UUID 更改处理传入请求的接口。

package main

import "fmt"

type Service interface{
	SayHi()
}

type MyService struct{}
func (s MyService) SayHi() {
	fmt.Println("Hi")
}

type SecondService struct{}
func (s SecondService) SayHi() {
	fmt.Println("Hello From the 2nd Service")
}

func main() {
	fmt.Println("Go Maps Tutorial")
	// we can define a map of string uuids to
    // the interface type 'Service'
	interfaceMap := make(map[string]Service)
	
    // we can then populate our map with 
    // simple ids to particular services
	interfaceMap["SERVICE-ID-1"] = MyService{}
	interfaceMap["SERVICE-ID-2"] = SecondService{}

	// Incoming HTTP Request wants service 2
	// we can use the incoming uuid to lookup the required
	// service and call it's SayHi() method
	interfaceMap["SERVICE-ID-2"].SayHi()

}

如果我们然后尝试运行它,我们应该看到我们已经成功地能够从这个Map中检索我们想要的服务,然后调用 SayHi() 方法。

$ go run main.go

Go Maps Tutorial
Hello From the 2nd Service


如果我们想变得更漂亮,我们可以遍历Map中的所有接口,就像我们在教程前面所做的那样,并调用每个 SayHi() 方法:

for key, service := range interfaceMap {
	fmt.Println(key)
	service.SayHi()
}


这将随后打印出服务密钥,然后调用它们各自的 SayHi() 方法。

结论
希望你喜欢这个 Go Map教程,它在某种程度上帮助了你! 如果您有任何反馈或意见,那么我很乐意在下面的评论部分听到它们!

文章链接