function - go 将动态创建的函数作为参数传递

标签 function go closures

好的。我无法理解“MyPrinter”到底发生了什么 让我一步步来(如有错误请指正)
1.“致敬”结构创建
2. 调用“Greet”函数
2.a 使用字符串“!!!”调用“CreatePrinterFunction”。该函数返回一个“MyPrinter”(witch是一个接受字符串但不返回任何内容的函数)
3. 变量“message”和“defaultMessage”使用字符串设置

现在问题来了,我不明白那些 do("str") 到底在做什么

package main
import "fmt"

type Salute struct {
    name string
    greeting string
}

type MyPrinter func (s string) ()

func Greet(salute Salute, do MyPrinter) {
    message, defaultMessage := CreateMessage(salute.name, salute.greeting, "noName")
    do(message)
    do(defaultMessage)
}

func Print(s string) {
    fmt.Print(s)
}
func PrintLine(s string) {
    fmt.Println(s)
}

func CreatePrinterFunction(custom string) MyPrinter {
    return func (s string) {
        fmt.Println(s + custom)
    }
}

func CreateMessage(name string, greeting ...string) (message string, defaultMessage string) {
    message = name + " " + greeting[0]
    defaultMessage = "hey " + name
    return
}

func main() {
    var s = Salute{"Joe", "hello"}
    // Greet(s, PrintLine)
    Greet(s, CreatePrinterFunction("!!!"))
}

最佳答案

CreatePrinterFunction 返回 function literal :

return func (s string) {
    fmt.Println(s + custom)
}

该函数文字实现了 MyPrinter 接口(interface),该接口(interface)是由任何采用字符串参数且不返回任何内容的函数实现的接口(interface):

type MyPrinter func(s string)

(请注意,所提供代码片段中的 MyPrinter 定义在末尾包含一个额外的 () ,但它不执行任何操作)

然后,创建的实现 MyPrinter 接口(interface)的函数将作为 Greet 函数的 do 参数传递:

func Greet(salute Salute, do MyPrinter) {

Greet中的代码运行do(message)时,创建的函数文字被调用,该函数又运行相当于fmt.Println(message) + 自定义)

这是一种做简单事情的相当复杂的方法。 :-)

关于function - go 将动态创建的函数作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18539219/

相关文章:

.net - 属性与功能(特别是 .NET)

powershell - 解释从 PowerShell 闭包调用的函数的作用域

go - Golang解决hackerrank的“对角线差异”问题

go - Go 的闭包在内存中是如何布局的?

在内部函数中分配外部变量的python闭包

JavaScript - 在 <input> 更改时运行函数 - 无 JQUERY

function - Clojure 核心库中大约有多少个函数?

javascript - JavaScript中变量的范围是什么?

arrays - 捕获数组索引错误

go - 在 GO 中设计 MVC 架构