news 2026/4/1 21:48:49

/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/26 20:05:45

Claude Code 完整学习计划

👋 欢迎! 你好!欢迎来到 Claude Code 学习之旅。这份学习计划专门为初学者设计,用最简单、最直白的方式帮你掌握这个强大的 AI 编程助手。 不用担心,我们会一步一步来,保证你能看懂、学会! &a…

作者头像 李华
网站建设 2026/3/30 16:42:59

AI 时代,我们是在进化还是在“脑力外包”?

当代码只剩“一句话”:AI 正在批量杀死程序员,还是在帮我们“脱壳”? 最近技术圈最焦虑的话题,莫过于 AI 程序员。 从 Cursor 的爆火到各种“一句话生成 App”的短视频刷屏,不少同行都在调侃:“以后不用写代码了,直接写小作文吧。”但玩笑归玩笑,深夜关掉编辑器,我们…

作者头像 李华
网站建设 2026/3/26 20:38:26

Spring Boot 2 + Flyway 最佳实践:多数据库配置与迁移规范

Spring Boot 2 Flyway 最佳实践:多数据库配置与规范化迁移适用技术栈:Spring Boot 2.x Flyway本文面向生产场景,提供一套可落地的 Flyway 最佳实践,涵盖多数据库配置方案、迁移脚本规范、环境隔离、回滚策略、团队协作与常见问题…

作者头像 李华
网站建设 2026/4/1 15:45:55

基于图像识别的智能垃圾分类系统设计与实现_jew30c27_xk054

一、项目技术介绍 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/…

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

十七、用 GPT2 中文对联模型实现经典上联自动对下联:

对联作为中华传统文化的瑰宝,讲究 “对仗工整、平仄协调、言简意赅”,而 AI 技术的发展让机器也能精准贴合对联的创作规则。本文以gpt2-chinese-couplet(GPT2 中文对联模型)为例,从代码解析、核心原理到效果优化&#…

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

基于ssm的体育器材管理系统设计与实现_ydina806

前言 基于SSM的体育器材管理系统通过整合Spring的轻量级容器管理、Spring MVC的请求响应控制以及MyBatis的数据持久化技术,构建了一个高效、稳定且易于扩展的管理平台。该系统能够全面管理体育器材的采购、入库、借出、归还、维修、报废等全生命周期过程&#xff0c…

作者头像 李华