当前位置: 首页 > news >正文

golang 柯里化(Currying)

使用场景:参数在语义上属于不同组,Go 语法无法在单次调用中声明多组可变参数,通过柯里化可以实现分步接收参数。
有的参数是在不同时间段产生,使用Currying可以让函数记住(缓存)参数,避免应用代码去手工管理缓存的参数。

demo代码:

package mainimport "fmt"// 2层柯里化函数:先接收arg,再接收otherArgs
func first(args ...int) func(args ...string) {return func(otherArgs ...string) {fmt.Println("Ints:", args)fmt.Println("Strings:", otherArgs)}
}// 三层柯里化函数:先接收int,再接收string,最后接收bool
func tripleCurry(a ...int) func(b ...string) func(c ...bool) {return func(b ...string) func(c ...bool) {return func(c ...bool) {fmt.Printf("Ints: %v\nStrings: %v\nBools: %v\n", a, b, c)}}
}// 四层柯里化函数:先接收int,再接收string,然后bool,最后[]byte
func tripleCurry4(a ...int) func(b ...string) func(c ...bool) func(d ...[]byte) {return func(b ...string) func(c ...bool) func(d ...[]byte) {return func(c ...bool) func(d ...[]byte) {return func(d ...[]byte) {fmt.Printf("Ints: %v\nStrings: %v\nBools: %v\nBytes: %v\n", a, b, c, d)}}}
}// 五层柯里化函数:先接收int,再接收string,然后bool,然后[]byte,最后float64
func tripleCurry5(a ...int) func(b ...string) func(c ...bool) func(d ...[]byte) func(e float64) {return func(b ...string) func(c ...bool) func(d ...[]byte) func(e float64) {return func(c ...bool) func(d ...[]byte) func(e float64) {return func(d ...[]byte) func(e float64) {return func(e float64) {fmt.Printf("Ints: %v\nStrings: %v\nBools: %v\nBytes: %v\n%v\n", a, b, c, d, e)}}}}
}func main() {fmt.Println("2层Currying")first(100, 200)("a", "b")fmt.Println()fmt.Println("3层Currying")tripleCurry(1, 2)("hello", "world")(true, false)fmt.Println()fmt.Println("4层Currying")tripleCurry4(1, 2)("hello", "world")(true, false)([]byte{0x01, 0x02})fmt.Println()fmt.Println("5层Currying")tripleCurry5(1, 2)("hello", "world")(true, false)([]byte{0x01, 0x02})(99.123)fmt.Println()// 分步调用示例/*step1 := tripleCurry4(10, 20)step2 := step1("foo", "bar")step3 := step2(true, false)step3([]byte{0x03, 0x04})*/
}

测试:

root@iZwz99zhkxxl5h6ecbm2xwZ:~/work/go# go mod init tt
go: /root/work/go/go.mod already exists
root@iZwz99zhkxxl5h6ecbm2xwZ:~/work/go# go mod tidy
root@iZwz99zhkxxl5h6ecbm2xwZ:~/work/go# 
root@iZwz99zhkxxl5h6ecbm2xwZ:~/work/go# ./tt 
2层Currying
Ints: [100 200]
Strings: [a b]3层Currying
Ints: [1 2]
Strings: [hello world]
Bools: [true false]4层Currying
Ints: [1 2]
Strings: [hello world]
Bools: [true false]
Bytes: [[1 2]]5层Currying
Ints: [1 2]
Strings: [hello world]
Bools: [true false]
Bytes: [[1 2]]
99.123root@iZwz99zhkxxl5h6ecbm2xwZ:~/work/go# 

相关文章:

  • 嵌入式开发学习(第二阶段 C语言笔记)
  • Golang | gRPC索引服务
  • Java jdk8版本特性(未完成版)
  • 截图后怎么快速粘贴到notability?
  • 常规算法学习
  • 打印Yolo预训练模型的所有类别及对应的id
  • 基于Unsloth框架快速微调Qwen3-14B模型的全面指南,包括Unsloth框架技术原理与微调代码实现
  • jenkins报错java.lang.OutOfMemoryError: Java heap space
  • 基于bp神经网络的adp算法
  • 创建型设计模式之Singleton(单例)设计模式
  • SMME 2025:创新海洋工程模式,迎接未来挑战
  • Android Compose开发架构选择指南:单Activity vs 多Activity
  • 银河麒麟V10通过制作rpm包升级httpd、php软件修复漏洞
  • Python 训练营打卡 Day 38
  • 浅谈国企数字化转型
  • Jenkins-Pipeline:学习笔记
  • 什么是软件的生命周期,以及常见的开发测试模型
  • 电脑软件管家 免安装便携 四十多种功能系统优化”“磁盘清理”“隐私保护
  • 【行动指南】大一如何高效备考java
  • 密钥管理系统在存储加密场景中的深度实践:以TDE透明加密守护文件服务器安全
  • 各学院二级网站建设通报/目前最火的自媒体平台
  • 做电影网站解决版权问题/正规专业短期培训学校
  • 免费只做网站/百度投诉中心24人工客服电话
  • 做网站开发的公司销售/可以搜索国外网站的搜索引擎
  • 建站套餐/小熊代刷推广网站
  • 网站建设推广哪里实惠/seo搜索引擎优化到底是什么