go动态创建函数作为参数

时间:2013-08-30 18:22:24

标签: function go closures

确定。我在使用“MyPrinter”理解究竟发生了什么事时遇到了一些麻烦 让我一步一步走(如果出了问题,请纠正我)
1.创建“敬礼”结构 2.呼叫“问候”功能
2.a使用strgin“!!!”调用“CreatePrinterFunction”。这个函数返回一个“MyPrinter”(女巫是一个接受字符串并且什么都不返回的函数)
3.使用字符串

设置变量“message”和“defaultMessage”

现在问题在于,我不明白那些做什么(“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("!!!"))
}

1 个答案:

答案 0 :(得分:2)

CreatePrinterFunction会返回function literal

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

该函数文字实现MyPrinter接口,该接口是由任何带有字符串参数且不返回任何内容的函数实现的接口:

type MyPrinter func(s string)

(请注意,提供的代码段中的MyPrinter定义在最后包含额外的(),但不执行任何操作。

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

func Greet(salute Salute, do MyPrinter) {

Greet内的代码运行do(message)时,将调用创建的函数文字,而后者则运行相当于fmt.Println(message + custom)的内容。

做一些简单的事情是一种非常复杂的方式。 : - )