为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
交互式爱情 2021-06-22 03:14:23
好的。我在理解“MyPrinter”到底发生了什么时遇到了一些麻烦让我一步一步来(如果有错误,请纠正我)1. 创建了“Salute”结构2. 调用“Greet”函数2.a使用字符串“!!!”调用“CreatePrinterFunction”。这个函数返回一个“MyPrinter”(witch 是一个函数,它接受一个字符串并且什么都不返回)3. 变量“message”和“defaultMessage”是用字符串设置的现在问题来了,我不明白那些 do("str") 到底在做什么package mainimport "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 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

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


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


查看完整回答
反对 回复 2021-06-28
  • 1 回答
  • 0 关注
  • 322 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信