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


你可以在官方文档的Go语法部分此处找到更多详细信息。

希望这些内容能对你有所帮助。

祝好

NobbZ 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

这种设计模式的优势在于:

  1. 延迟执行:可以在需要时才真正获取最终函数
  2. 状态保持:中间函数可以访问和操作外层函数的变量(如start
  3. 中间处理:可以在返回最终函数前执行一些操作(如记录时间)

如果直接返回 func(string) string,就无法在获取最终函数之前执行中间逻辑(如打印时间差)。这种多层级函数返回在需要函数组合、装饰器模式或中间件实现时特别有用。

回到顶部