好的。我无法理解“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/