当前位置: 首页 > news >正文

/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

http://www.jsqmd.com/news/327195/

相关文章:

  • 图的遍历/存储
  • wchar_t与_T()
  • WideCharToMultiByte与T2A
  • springboot基于微信小程序的扶贫助农系统及其小程序的实现_3pi4tt74_zl003
  • 基于微信小程序的精致护肤购物系统的设计与实现_r9xwp2r9
  • 基于图像识别的智能垃圾分类系统设计与实现_jew30c27_xk054
  • 豆包“炒股”翻车,程序员该为AI的“幻觉”背锅吗?
  • 高并发图书下载服务架构实践:小哈图书下载中心
  • AI 时代,我们是在进化还是在“脑力外包”?
  • 基于微信小程序的咖啡店点餐系统_56v41c6q
  • 2026成都GEO优化公司排名专业测评,专注本地化AI优化
  • 高效进阶不踩坑!静流书站(windowsfront.com)承包程序员全阶段学习资源
  • CCF-GESP 等级考试 2025年3月认证C++一级真题解析 - 指南
  • 基于SSM的种子商店网站的设计与开发_ci5gjw6e_zl067
  • 基于SSM的生产设备信息管理系统的设计与实现_l1fn0xee_jz056
  • 寒假7
  • Steam土豆兄弟游戏开发学习案例记录——Unity
  • Flutter for HarmonyOS 图书管理系统登录注册:Provider状态管理+自定义Widget,打造高效用户入口
  • 河北省旅游网站(11852)
  • 沃尔玛购物卡回收时这些关键点需牢记
  • 基于ssm的社区外来务工人员管理系统_10vz9c0a_jz119
  • VGGT:视觉几何接地变压器 - MKT
  • 河北经贸大学勤工助学管理系统(11851)
  • Spring Boot 2 + Flyway 最佳实践:多数据库配置与迁移规范
  • 2026切削液集中过滤系统推荐榜单:三大核心玩家综合实力测评,制造业降本增效选型指南
  • 十七、用 GPT2 中文对联模型实现经典上联自动对下联:
  • 基于springboot宠物交易管理平台设计与实现
  • 基于springboot鞍山钢峰风机人力资源管理系统
  • 2026停车场道闸厂家排名实评|宜泊科技:以专利和口碑稳居一线梯队
  • 2026空间蛋白质组学服务商选型指南:技术拆解与临床应用全景