猿问

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

好的。我在理解“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("!!!"))

}


交互式爱情
浏览 323回答 1
1回答

阿波罗的战车

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).这是一种非常复杂的方式来做一些简单的事情。:-)
随时随地看视频慕课网APP

相关分类

Go
我要回答