2

好的。我很难理解“MyPrinter”到底发生了什么让我一步一步来(如果有问题请纠正我)
1. 创建了“Salute”结构
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("!!!"))
}
4

1 回答 1

2

CreatePrinterFunction返回一个函数文字

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).

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

于 2013-08-30T19:25:11.613 回答