news 2026/4/9 22:32:38

/go/src/github.com/samber/lo 切片转MAP

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
/go/src/github.com/samber/lo 切片转MAP

samber/lo库提供了多个函数用于将切片(Slice)转换为 Map,比手写循环更简洁安全。以下是主要用法:

核心函数

1. Associate(键值自定义)

将切片转换为 map,同时定义 key 和 value 的生成逻辑

go

复制

import "github.com/samber/lo" users := []User{ {ID: 1, Name: "Alice", Age: 25}, {ID: 2, Name: "Bob", Age: 30}, } // map[ID]Name nameMap := lo.Associate(users, func(u User) (int, string) { return u.ID, u.Name }) // 结果: map[1:Alice 2:Bob]

2. KeyBy(按字段索引)

最常用,元素本身作为 value,key 由函数决定:

go

复制

// map[ID]User - 快速根据 ID 查找用户 userMap := lo.KeyBy(users, func(u User) int { return u.ID }) // 使用 if user, ok := userMap[1]; ok { fmt.Println(user.Name) }

3. GroupBy(分组聚合)

当 key 可能重复时,生成 map[K][]T

go

复制

usersByAge := lo.GroupBy(users, func(u User) int { return u.Age }) // 结果: map[25:[{1 Alice 25}] 30:[{2 Bob 30}]]

对比与选择

表格

复制

函数返回类型适用场景冲突处理
KeyBymap[K]T建立主键索引后覆盖前
Associatemap[K]V提取特定字段组合后覆盖前
GroupBymap[K][]T一对多关系收集到切片

实战示例

go

复制

package main import ( "fmt" "github.com/samber/lo" ) type User struct { ID int Name string Dept string } func main() { users := []User{ {1, "Alice", "Tech"}, {2, "Bob", "Tech"}, {3, "Charlie", "HR"}, } // 场景1: ID 快速查找 userMap := lo.KeyBy(users, func(u User) int { return u.ID }) // 场景2: 只取 Name 映射 idToName := lo.Associate(users, func(u User) (int, string) { return u.ID, u.Name }, ) // 场景3: 按部门分组 deptGroups := lo.GroupBy(users, func(u User) string { return u.Dept }) fmt.Println(userMap[1].Name) // Alice fmt.Println(idToName[2]) // Bob fmt.Println(len(deptGroups["Tech"])) // 2 }

注意事项

  1. 重复 Key 处理

    • KeyByAssociate遇到重复 key 时,后面元素覆盖前面

    • 如需保留所有,改用GroupBy

  2. 性能

    • 内部已优化内存预分配(make(map[...], len(collection))

    • 比手写for循环更简洁且无需担心容量问题

  3. 空切片安全

    • 传入空切片返回空 map(非 nil),可直接安全使用

安装go get github.com/samber/lo

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 9:11:22

豆包“炒股”翻车,程序员该为AI的“幻觉”背锅吗?

20万入市一周亏5万:当大模型开始“一本正经胡说八道”,程序员该反思什么? 最近,一则“豆包虚假业绩信息坑惨股民”的新闻在技术圈和金融圈炸了锅。一位股民因为信任 AI 生成的“虚假盈利数据”盲目入市,结果一周亏掉 5 万,换来的是客服一句回复:“生成内容不建议作为专…

作者头像 李华
网站建设 2026/3/27 10:45:21

基于springboot鞍山钢峰风机人力资源管理系统

前言 本文设计并实现了一款基于Spring Boot框架的鞍山钢峰风机人力资源管理系统,旨在解决传统人力资源管理中效率低、操作繁琐等问题。系统采用B/S架构模式,以Java为开发语言,结合MySQL数据库进行数据存储与管理,确保系统具备高稳…

作者头像 李华
网站建设 2026/3/21 0:11:25

数据复制技术在大数据风控中的应用

数据复制技术在大数据风控中的应用 1. 引入与连接 1.1 引人入胜的开场 想象一下,一家金融科技公司正准备向一位新客户发放一笔小额贷款。在做出决策之前,他们需要评估这位客户的信用风险。在这个大数据时代,公司手头拥有海量的数据&#xff0…

作者头像 李华
网站建设 2026/4/1 1:39:57

基于微信小程序的健康体检预约系统开题报告

目录项目背景与意义系统功能概述技术方案创新点预期成果项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作项目背景与意义 微信小程序健康体检预约系统旨在解决传统体检预约流程繁琐、信息不对称等问题。通过…

作者头像 李华
网站建设 2026/3/25 21:38:17

基于微信小程序的创新互动教学的设计与实现开题报告

目录 研究背景与意义研究目标研究内容创新点预期成果进度计划 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 研究背景与意义 微信小程序凭借其免安装、跨平台、开发成本低等优势,在教育领域…

作者头像 李华