Golang函数签名中如何声明多个'func'
Golang函数签名中如何声明多个’func’
当我们声明像下面示例中的 func() func(…) 时,这是什么意思?
所以函数声明中出现了三个(!) func 关键字。
func sss() func() func(string) string {
start := time.Now()
return func() func(string) string {
fmt.Printf("Time from start %v", time.Since(start))
return getTime
}
}
为什么我们应该返回 func() func(string) string 而不是 func(string) string?
更多关于Golang函数签名中如何声明多个'func'的实战教程也可以访问 https://www.itying.com/category-94-b0.html
4 回复
sss 是一个函数(左侧的 func),它返回一个不接受参数但返回接受字符串的函数的函数。
更多关于Golang函数签名中如何声明多个'func'的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
NobbZ:
一个接收字符串的函数
并返回字符串。哇
这是一个高阶函数(higher-order function)的声明,其中函数返回的是另一个函数,而那个被返回的函数本身又返回一个函数。这种模式在Go语言中很常见,特别是在需要延迟执行、中间件或函数装饰器的场景中。
让我们分析一下这个函数签名:
func sss() func() func(string) string
sss是一个函数- 它返回一个类型为
func() func(string) string的函数 - 这个返回的函数本身不接受参数,但返回另一个类型为
func(string) string的函数
在您提供的示例中,这种设计可能有以下用途:
package main
import (
"fmt"
"time"
)
func getTime(s string) string {
return fmt.Sprintf("%s: %v", s, time.Now())
}
func sss() func() func(string) string {
start := time.Now()
return func() func(string) string {
fmt.Printf("Time from start: %v\n", time.Since(start))
return getTime
}
}
func main() {
// 获取中间函数
middleFunc := sss()
// 调用中间函数,获取最终的时间获取函数
timeFunc := middleFunc()
// 使用最终函数
result := timeFunc("Current time")
fmt.Println(result)
}
输出示例:
Time from start: 1.042µs
Current time: 2023-10-01 12:00:00.123456 +0000 UTC
这种设计模式的优势在于:
- 延迟执行:可以在需要时才真正获取最终函数
- 状态保持:中间函数可以访问和操作外层函数的变量(如
start) - 中间处理:可以在返回最终函数前执行一些操作(如记录时间)
如果直接返回 func(string) string,就无法在获取最终函数之前执行中间逻辑(如打印时间差)。这种多层级函数返回在需要函数组合、装饰器模式或中间件实现时特别有用。

