news 2026/4/18 5:25:53

/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/4/7 22:47:22

恶意代码演变:AI 生成的多态恶意软件与免杀技巧

⚠️ 免责声明 本文仅用于网络安全技术交流与学术研究。文中涉及的技术、代码和工具仅供安全从业者在获得合法授权的测试环境中使用。任何未经授权的攻击行为均属违法,读者需自行承担因不当使用本文内容而产生的一切法律责任。技术无罪,请将其用于正途。…

作者头像 李华
网站建设 2026/4/7 3:12:47

基于深度学习YOLO26算法的智慧电力与智慧工业钢缆缺陷检测 电缆散股检测钢丝绳断裂缺陷检测 深度学习图像识别第10463期

计算机视觉数据集说明 往期热门主题 主页搜两字"关键词"直达 代码数据获取: 获取方式:***文章底部卡片扫码获取***. 覆盖了YOLO相关项目、OpenCV项目、CNN项目等所有类别, 覆盖各类项目场景: 项目名称项目名称基于Y…

作者头像 李华
网站建设 2026/4/9 15:41:54

C++可变模板参数详细讲解

先给你一句终极人话(背下来,这就是全部)Args 你随便起的一个名字,跟 int a 里的 a 一样,想改成 ABC、Params、Shit 都行,没有任何魔法。... 只有两个功能:打包、拆包写在左边:...A…

作者头像 李华
网站建设 2026/4/5 3:56:41

【图像处理相关毕设选题选题指导】2026新颖优质选题推荐

目录 前言毕设选题更多帮助选题迷茫选题的重要性最后前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说…

作者头像 李华
网站建设 2026/3/27 16:24:35

Redis快速实现布隆过滤器:缓存去重的“智能门卫”

在缓存架构中,总有一些“头疼问题”:用户反复提交相同请求、查询不存在的key导致缓存穿透、海量数据去重效率低下……这些场景下,Redis布隆过滤器就是当之无愧的“救星”。它像一个智能门卫,能快速判断“这个人是不是来过”“这个…

作者头像 李华