前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言中切片(slice)和字典(map)扩展方法

Go语言中切片(slice)和字典(map)扩展方法

作者头像
码客说
发布2024-03-29 12:51:21
780
发布2024-03-29 12:51:21
举报
文章被收录于专栏:码客码客

前言

Go本身slice的方法是较少的,其他语言中的过滤和转换相关的经常使用的方法也没有,我们可以扩展一下方便使用。

切片slice

过滤

方法

通过一个函数参数来过滤所需的元素,只有满足条件元素才返回到结果集中:

代码语言:javascript
复制
func SliceFilter[T any](s []T, fn func(T) bool) []T {
    result := make([]T, 0, len(s))
    for _, v := range s {
        if fn(v) {
            result = append(result, v)
        }
    }

    return result
}

判空也是常用的功能,获取所有非空集:

代码语言:javascript
复制
func SliceFilterNonNil[T any](s []*T) []*T {
    return SliceFilter(s, func(t *T) bool {
        return t != nil
    })
}

调用

代码语言:javascript
复制
package test

import (
	"fmt"
	"strings"
	"testing"
	"xh-control-ws/utils"
)

// 普通的测试
func Test02(t *testing.T) {
	var nameList []string
	nameList = append(nameList, "张三", "李四", "王五")
	result := utils.SliceFilter(nameList, func(item string) bool {
		return strings.HasPrefix(item, "张")
	})
	fmt.Println(result) // 输出过滤后的结果
}

转换

方法

通过一个转换函数,可方便地把原切片转换为新的切片:

代码语言:javascript
复制
func SliceTrans[S, R any](s []S, fn func(S) R) []R {
    result := make([]R, 0, len(s))
    for _, v := range s {
        result = append(result, fn(v))
    }
    return result
}

若只需要转换满足条件的元素,可先过滤再转换:

代码语言:javascript
复制
func SliceTransWithFilter[S, R any](s []S, fn func(S) (R, bool)) []R {
    result := make([]R, 0, len(s))
    for _, v := range s {
        if r, ok := fn(v); ok {
            result = append(result, r)
        }

    }
    return result
}

调用

代码语言:javascript
复制
package test

import (
	"fmt"
	"testing"
	"xh-control-ws/utils"
)

// 普通的测试
func Test02(t *testing.T) {
	var nameList []string
	nameList = append(nameList, "张三", "李四", "王五")
	result := utils.SliceTrans(nameList, func(item string) string {
		return item + "同学"
	})
	fmt.Println(result)
}

累计

对切片中的元素累计,获取一个最终结果:

代码语言:javascript
复制
func SliceAccum[S, R any](init R, s []S, fn func(last R, ele S) R) R {
    result := init
    for _, v := range s {
        result = fn(result, v)
    }

    return result
}

字典 map

过滤

方法

代码语言:javascript
复制
func MapFilter[K comparable, V any](m map[K]V, fn func(key K, value V) bool) map[K]V {
    result := make(map[K]V, len(m))
    for k, v := range m {
        if fn(k, v) {
            result[k] = v
        }
    }

    return result
}

调用

代码语言:javascript
复制
package test

import (
	"fmt"
	"testing"
	"xh-control-ws/utils"
)

// 普通的测试
func Test01(t *testing.T) {
	userinfo := map[string]string{"name": "xiaoming"}
	userinfo["name"] = "xiaohong"
	userinfo["age"] = "18"

	result := utils.MapFilter(userinfo, func(key string, value string) bool {
		return key == "name"
	})
	fmt.Println(result)
}

结果

代码语言:javascript
复制
map[name:xiaohong]

转换

方法

代码语言:javascript
复制
func MapTrans[K comparable, V, R any](m map[K]V, fn func(key K, value V) (R, bool)) map[K]R {
    result := make(map[K]R, len(m))
    for k, v := range m {
        if r, ok := fn(k, v); ok {
            result[k] = r
        }
    }
    return result
}

掉用

代码语言:javascript
复制
package test

import (
	"fmt"
	"strings"
	"testing"
	"xh-control-ws/utils"
)

// 普通的测试
func Test01(t *testing.T) {
	userinfo := map[string]string{"name": "xiaoming"}
	userinfo["name"] = "xiaohong"
	userinfo["age"] = "18"

	result := utils.MapTrans(userinfo, func(key string, value string) (string, bool) {
		if key == "name" {
			return strings.ToUpper(value), true
		} else {
			return value + "岁", true
		}
	})
	fmt.Println(result)
}

结果

代码语言:javascript
复制
map[age:18岁 name:XIAOHONG]

其中返回值中的bool,代表对应的key是否保留。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 切片slice
    • 过滤
      • 方法
      • 调用
    • 转换
      • 方法
      • 调用
    • 累计
    • 字典 map
      • 过滤
        • 方法
        • 调用
      • 转换
        • 方法
        • 掉用
    相关产品与服务
    腾讯云服务器利旧
    云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档