广告
返回顶部
首页 > 资讯 > 精选 >Go语言中的Slice链式操作方法是什么
  • 945
分享到

Go语言中的Slice链式操作方法是什么

2023-07-05 23:07:07 945人浏览 泡泡鱼
摘要

今天小编给大家分享一下Go语言中的Slice链式操作方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。示例首先模拟一个

今天小编给大家分享一下Go语言中的Slice链式操作方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

示例

首先模拟一个业务场景,有订单、产品、自定义订单三个结构体,订单中包含多个产品:

type Order struct {Id       stringProducts []Product}type Product struct {Id    stringPrice int}type CustomOrder struct {Id string}

初始化模拟数据:

var orders = []Order{{Id: "o1",Products: []Product{{Id:    "p1",Price: 1,},{Id:    "p2",Price: 2,},},},{Id: "o2",Products: []Product{{Id:    "p3",Price: 3,},{Id:    "p4",Price: 4,},},},}

接下来对订单列表做各种操作:

// 过滤Id为o2的订单func TestFilter(t *testing.T) {res := Lists[Order](orders).Filter(func(o any) bool {return o.(Order).Id == "o2"}).Collect()t.Log(res) // [{o2 [{p3 3} {p4 4}]}]}// 将订单列表映射为自定义订单列表func TestMap(t *testing.T) {res := Lists[CustomOrder](orders).Map(func(o any) any {return CustomOrder{Id: "custom-" + o.(Order).Id,}}).Collect()t.Log(res) // [{custom-o1} {custom-o2}]}// 将每个订单里的产品展开,并映射为自定义订单func TestFlatAndMap(t *testing.T) {res := Lists[CustomOrder](orders).Flat(func(o any) []any {return Lists[any](o.(Order).Products).ToList()}).Map(func(p any) any {return CustomOrder{Id: "ProductId-" + p.(Product).Id,}}).Collect()t.Log(res) // [{ProductId-p1} {ProductId-p2} {ProductId-p3} {ProductId-p4}]}// 找到所有订单产品中价格最贵的那个产品func TestMax(t *testing.T) {res, found := Lists[Product](orders).Flat(func(o any) []any {return Lists[any](o.(Order).Products).ToList()}).Max(func(i, j any) bool {return i.(Product).Price > j.(Product).Price})t.Log(found, res) // true {p4 4}}

原理

type List[T any] struct {list []any}

将 go 中的原生切片包装成 List[T] 结构体,特别说明其中的泛型 T 是最终结果的元素类型,并不是原始传入切片的类型。

这样设计是因为 go 只能在构造结构体时指定泛型,因此将 List[T] 的泛型指定为最终结果的元素类型,就可以在操作完成后调用 Collect() 方法,得到最终的 T 类型切片,方便后面的业务逻辑使用。

因为 go 不支持在接受者函数中定义泛型,因此所有操作函数的参数和返回值类型只能定义为any,然后在函数体内转换为业务结构体使用,例如上面的 i.(Product).Price

此后将每一种操作,例如Filter、Map、Flat等,都返回List[T] 结构体,就可以实现链式操作。

实现

type List[T any] struct {list []any}func Lists[T any](items any) *List[T] {rv := reflect.ValueOf(items)if rv.Kind() != reflect.Slice {panic(fmt.Sprintf("not supported type: %v, please use slice instead", rv.Kind()))}l := rv.Len()s := make([]any, 0, l)for i := 0; i < l; i++ {s = append(s, rv.Index(i).Interface())}return &List[T]{list: s,}}func (s *List[T]) Filter(fn func(any) bool) *List[T] {l := make([]any, 0)for _, e := range s.list {if fn(e) {l = append(l, e)}}s.list = lreturn s}func (s *List[T]) Map(fn func(any) any) *List[T] {l := make([]any, 0)for _, element := range s.list {l = append(l, fn(element))}return &List[T]{list: l,}}func (s *List[T]) Flat(fn func(any) []any) *List[T] {l := make([]any, 0)for _, element := range s.list {l = append(l, fn(element)...)}return &List[T]{list: l,}}func (s *List[T]) Sort(fn func(i, j any) bool) *List[T] {if len(s.list) <= 0 {return s}sort.SliceStable(s.list, func(i, j int) bool {return fn(s.list[i], s.list[j])})return s}func (s *List[T]) Max(fn func(i, j any) bool) (T, bool) {return s.Sort(fn).FindFirst()}func (s *List[T]) FindFirst() (T, bool) {if len(s.list) <= 0 {var nonsense Treturn nonsense, false}return s.list[0].(T), true}func (s *List[T]) ToList() []any {return s.list}func (s *List[T]) Collect() []T {t := make([]T, 0)for _, a := range s.list {t = append(t, a.(T))}return t}

以上就是“Go语言中的Slice链式操作方法是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Go语言中的Slice链式操作方法是什么

本文链接: https://www.lsjlt.com/news/356100.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go语言中的Slice链式操作方法是什么
    今天小编给大家分享一下Go语言中的Slice链式操作方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。示例首先模拟一个...
    99+
    2023-07-05
  • 详解Go语言中的Slice链式操作
    目录示例原理实现示例 首先模拟一个业务场景,有订单、产品、自定义订单三个结构体,订单中包含多个产品: type Order struct { Id string Pr...
    99+
    2023-05-15
    Go Slice链式操作 Go Slice操作 Go Slice
  • Go语言中slice的反转方法怎么使用
    这篇文章主要介绍了Go语言中slice的反转方法怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中slice的反转方法怎么使用文章都会有所收获,下面我们一起来看看吧。使用for循环和切片的索引最基...
    99+
    2023-07-06
  • ABAP和Go语言的初始化操作方法是什么
    本篇内容主要讲解“ABAP和Go语言的初始化操作方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ABAP和Go语言的初始化操作方法是什么”吧!# ABAPGo作用同上:Kubernete...
    99+
    2023-06-03
  • c语言链表的删除方法是什么
    在C语言中,链表的删除操作通常需要执行以下步骤:1. 首先,创建一个指针用于指向要删除的节点,通常称为"current"或者"tem...
    99+
    2023-08-25
    c语言
  • php链式操作mysql数据库的方法是什么
    本篇内容介绍了“php链式操作mysql数据库的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!封装类常用操作使用示例// ...
    99+
    2023-07-05
  • C语言中链表的作用是什么
    C语言中链表的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先,指针计算机中的所有内容都是数字。在C语言中创建变量时,编译器仅按地址处理它,但是在您...
    99+
    2023-06-16
  • C语言中常见的文件操作方法是什么
    今天小编给大家分享一下C语言中常见的文件操作方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.为什么使用文件大家在...
    99+
    2023-07-02
  • GO语言中HTTP打包文件的方法是什么?
    随着互联网的不断发展,文件上传和下载已经成为了我们日常生活中不可或缺的一部分。在这个过程中,HTTP协议无疑是最常用的协议之一。GO语言作为一门新兴的编程语言,对于HTTP协议的支持也非常完善,本文将介绍GO语言中HTTP打包文件的方法。...
    99+
    2023-06-24
    http 打包 文件
  • go语言中方法和函数的区别是什么
    区别:1、函数function是一段具有独立功能的代码,可以被反复多次调用,从而实现代码复用;而方法method是一个类的行为功能,只有该类的对象才能调用。2、方法有接受者,而函数无接受者。3、函数不可以重名,而方法可以重名。4、调用方式不...
    99+
    2023-05-14
    go语言 Golang
  • API在GO语言中的作用是什么?
    API,全称为“Application Programming Interface”,即应用程序编程接口,是一组预定义的函数和规则,用于访问操作系统、硬件或软件功能的一种方式。在GO语言中,API具有非常重要的作用,可以帮助开发者更方便地...
    99+
    2023-10-26
    linux windows api
  • R语言操作文件的方法什么
    这篇文章主要介绍“R语言操作文件的方法什么”,在日常操作中,相信很多人在R语言操作文件的方法什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”R语言操作文件的方法什么”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-25
  • c语言单链表创建的方法是什么
    创建一个单链表的方法可以有多种实现方式,以下是其中的一种常见方法:1. 定义一个链表节点的结构体,包含一个数据域和一个指向下一个节点...
    99+
    2023-10-18
    c语言
  • mysql语法中DQL操作方法是什么
    今天小编给大家分享一下mysql语法中DQL操作方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。DQL(Data Q...
    99+
    2023-06-26
  • Go语言中内存管理逃逸的方法是什么
    本篇内容介绍了“Go语言中内存管理逃逸的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 前言所谓的逃逸分析(Escape an...
    99+
    2023-07-05
  • go语言字符串拼接的方法是什么
    在Go语言中,可以使用`+`运算符或`fmt.Sprintf()`函数来进行字符串拼接。1. 使用`+`运算符```gostr1 :...
    99+
    2023-09-27
    go语言
  • Go语言中结构体的作用是什么
    这篇文章给大家介绍Go语言中结构体的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。自定义类型type 自定义类型名 类型名 例: type NewInt&nb...
    99+
    2023-06-15
  • Go语言中变量的作用域是什么
    这篇文章给大家介绍Go语言中变量的作用域是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。Go 语言中变量可以在三个地方声明:函数内定义的变...
    99+
    2023-06-08
  • go语言中main函数的作用是什么
    本篇文章和大家了解一下go语言中main函数的作用是什么。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。在go语言中,main是“主要”的意思,是Go语言程序的默认入口函数(主函数),是一个没有任何参数和返回值的函数;ma...
    99+
    2023-07-04
  • 异步编程在Go语言中的实现方式是什么?
    随着互联网的不断发展,越来越多的应用程序需要处理大量的并发请求。在这种情况下,传统的同步编程方式已经无法满足需求。异步编程是一种解决并发问题的有效方式,它能够充分利用系统资源,提高程序的并发能力。本文将介绍异步编程在Go语言中的实现方式,...
    99+
    2023-09-28
    对象 自然语言处理 异步编程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作