我们经常需要程序在数据集上执行操作,比如选择满足给定条件的所有项,或者将所有的项通过一个自定义函数映射到一个新的集合上。

在某些语言中,会习惯使用泛型。 Go 不支持泛型,在 Go 中,当你的程序或者数据类型需要 时,通常是通过组合的方式来提供操作函数。

这是一些 strings 切片的组合函数示例。你可以使用这些例子来构建自己的函数。注意有时候,直接使用内联组合操作代码会更清晰,而不是创建并调用一个帮助函数。

collection-functions.go

package main

import "strings"
import "fmt" // 返回目标字符串 `t` 出现的的第一个索引位置,
// 或者在没有匹配值时返回 -1。
func Index(vs []string, t string) int {
for i, v := range vs {
if v == t {
return i
}
}
return -1
} // 如果目标字符串 `t` 在这个切片中则返回 `true`。
func Include(vs []string, t string) bool {
return Index(vs, t) >= 0
} // 如果这些切片中的字符串有一个满足条件 `f` 则返回 `true`。
func Any(vs []string, f func(string) bool) bool {
for _, v := range vs {
if f(v) {
return true
}
}
return false
} // 如果切片中的所有字符串都满足条件 `f` 则返回 `true`。
func All(vs []string, f func(string) bool) bool {
for _, v := range vs {
if !f(v) {
return false
}
}
return true
} // 返回一个包含所有切片中满足条件 `f` 的字符串的新切片。
func Filter(vs []string, f func(string) bool) []string {
vsf := make([]string, 0)
for _, v := range vs {
if f(v) {
vsf = append(vsf, v)
}
}
return vsf
} // 返回一个对原始切片中所有字符串执行函数 `f` 后的新切片。
func Map(vs []string, f func(string) string) []string {
vsm := make([]string, len(vs))
for i, v := range vs {
vsm[i] = f(v)
}
return vsm
} func main() { // 这里试试这些组合函数。
var strs = []string{"peach", "apple", "pear", "plum"} fmt.Println(Index(strs, "pear")) fmt.Println(Include(strs, "grape")) fmt.Println(Any(strs, func(v string) bool {
return strings.HasPrefix(v, "p")
})) fmt.Println(All(strs, func(v string) bool {
return strings.HasPrefix(v, "p")
})) fmt.Println(Filter(strs, func(v string) bool {
return strings.Contains(v, "e")
})) // 上面的例子都是用的匿名函数,但是你也可以使用类型正确的命名函数
fmt.Println(Map(strs, strings.ToUpper)) }

运行:

go run collection-functions.go
2
false
true
false
[peach apple pear]
[PEACH APPLE PEAR PLUM]

go 组合函数 Collection的更多相关文章

  1. javascript柯里化及组合函数~

    大家是不是看我上篇博文有点蒙.用的的curry和compose是什么鬼,怎么那么神奇.上篇博文也是主要用到了这两个函数.那今天我们来聊一下curry和compose,这两个东西是函数式编程很重要的东西 ...

  2. js的组合函数

    1.组合函数即由若干个函数组合成一个新的函数,同时完成数据的传递 1>最简单版本 这种方法实现的组合函数,需要我们指定函数的执行顺序 /**第一种方法 */ function add(a, b) ...

  3. oracle 子查询和组合函数

    oracle 子查询和组合函数 --查询与"SCOTT"在同一个部门的员工 select empno,ename,deptno from emp where deptno in ( ...

  4. go结构体组合函数

    结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就简的语言,一切令人困惑的特性都必须去掉. 简单来讲,Go提供的结构体就是把使用各种数据类型定义的不同变量组合起来的高级数 ...

  5. JavaScript函数式编程(纯函数、柯里化以及组合函数)

    JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 函数式编程(Functional Programming),又称为泛函编程,是一种编程范式.早在很久以前就提出了函数式编程这个概念了 ...

  6. lambda高级进阶--组合函数

    只有一个参数的函数可以将一个值转换成另一个值,如果你有2个这样的转换函数,那么在进行一个转换之后在进行第二个转换,其实也是一个中转换. 说到这里,先说一下我个人的一个习惯,我在写javaBean的se ...

  7. implode() 数组元素组合函数

    定义和用法 implode() 函数把数组元素组合为一个字符串. 语法:implode(separator,array); 说明 虽然 separator 参数是可选的.但是为了向后兼容,推荐您使用使 ...

  8. JavaScript-原型&原型链&原型继承&组合函数

    小小的芝麻之旅: 今天学习了js的原型,要说原型,我们先简单说一下函数创建过程. 原型 每个函数在创建的时候js都自动添加了prototype属性,这就是函数的原型,原型就是函数的一个属性,类似一个指 ...

  9. python自带的排列组合函数

    需求: 在你的面前有一个n阶的台阶,你一步只能上1级或者2级,请计算出你可以采用多少种不同的方法爬完这个楼梯?输入一个正整数表示这个台阶的级数,输出一个正整数表示有多少种方法爬完这个楼梯. 分析:提炼 ...

  10. python内置函数-排列组合函数

    product 笛卡尔积 (有放回抽样排列) permutations 排列 (不放回抽样排列) combinations 组合,没有重复 (不放回抽样组合) combinations_with_re ...

随机推荐

  1. Qt编写安防视频监控系统68-兼容Qt4到Qt6

    一.前言 为了从Qt4.7兼容到Qt6.2及后续版本,着实花了不少精力,前提也是对自定义控件大全和各种跨平台的轮子组件全部做成了兼容Qt4到Qt6,这样只剩下UI这块需要兼容就好办多了,各个击破战略, ...

  2. OpenWrt安装腾讯云DDNS插件

    1.插件介绍 OpenWRT TencentDDNS插件是一款腾讯云研发的,自动映射动态公网IP至用户指定的DNSPod域名解析记录的官方插件. 标题 名称 中文名称 腾讯云DDNS插件 英文名称 l ...

  3. Note / Solution Set -「Binomial Sum」两道例题

      删本地文件的时候瞟了一眼内容 ... 这篇好像忘记发布了?   给定 \(n,k\), 求出 \[\textit{ans}=\sum_{i=0}^n\binom{n}{i}i^k\bmod(10^ ...

  4. Kotlin:【标准库函数】with、also、takeif、takeUnless

  5. 四.1 Redis 五大数据类型/结构的详细说明/详细使用(List 列表数据类型详解和使用)

    四.1 Redis 五大数据类型/结构的详细说明/详细使用(List 列表数据类型详解和使用) @ 目录 四.1 Redis 五大数据类型/结构的详细说明/详细使用(List 列表数据类型详解和使用) ...

  6. (vm/vb)虚拟机复制或者拷贝之后连不上网络怎么处理?

    (vm/vb)虚拟机复制或者拷贝之后连不上网络怎么处理? Linux虚拟机无论在VMware还是VirtualBox下面,只要复制拷贝到别的地方,开启网络服务都会出现报错的问题. 这里以CentOS ...

  7. 使用Shell工具连接Kali Linux

    使用Shell工具连接Kali Linux 允许root用户登录ssh服务 1.使用命令 vim /etc/ssh/sshd_config 打开SSH的配置文件 2.将33行的 prohibit-pa ...

  8. 并发编程 - 线程同步(六)之锁lock

    通过前面对Interlocked类的学习,相信大家对线程同步机制有了更深的理解,今天我们将继续需要另一种同步机制--锁lock. lock是C#语言中的关键字,是线程同步机制的一种简单的互斥锁实现方式 ...

  9. Sdcb Chats 重磅更新:深度集成 DeepSeek-R1,思维链让 AI 更透明!

    Sdcb Chats 是一个强大且易于部署的 ChatGPT 前端,旨在帮助用户轻松接入和管理各种主流的大语言模型. Sdcb Chats 主要特性: 广泛的大模型支持: 已支持 15 种不同的大语言 ...

  10. FreeSql学习笔记——2.插入

    前言 由于还没有表结构,就先从新增开始,插入一些数据后才好做查询.修改.删除操作. 初始化 前面注入FreeSql时设置过自动同步表结构,那么就不用管数据库了,只需要在项目中定义实体,就会自动生成表结 ...