2013-08-30 49 views
2

好的。我在使用“MyPrinter”时遇到了一些困难 让我一步一步(如果出现问题请纠正我)
1.创建“致敬”结构
2.致电“致电“功能
2.a用”!!!“调用”CreatePrinterFunction“。这个函数返回一个“MyPrinter”(女巫是一个函数,它在一个字符串,并没有返回值)
3.变量“消息”和“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("!!!")) 
} 

回答

2

CreatePrinterFunction返回function literal

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

该功能字面实现了我打印机接口,这是任何功能实现的接口,需要一个字符串参数并没有返回值:

type MyPrinter func(s string) 

(注意,在所提供的代码片段的MyPrinter定义包含:在不执行任何结束的额外()

func Greet(salute Salute, do MyPrinter) { 

宽:

然后,创建的功能它实现了MyPrinter接口作为do参数Greet函数的传递在Greet内部的母鸡代码运行do(message),创建的函数文字被调用,其依次运行相当于fmt.Println(message + custom)

这是一个相当复杂的方式来做一些简单的事情。 :-)

+0

“MyPrinter”是什么意思。它是专门寻找一个函数,它获取一个字符串并返回一个类型为“MyPrinter”的函数,或者只是一个函数,它将得到一个字符串并且不返回任何内容。如果有多个函数返回“MyPrinter”,将会发生什么 – waaadim

+0

'做MyPrinter'只是意味着函数接受一个名为'do'的参数,它必须实现'MyPrinter'接口。您可以根据需要使用多个实现“MyPrinter”接口的函数,并且可以将它们中的任何一个作为参数提供给该函数。 –

+0

好吧,现在我明白了。我认为''MyPrinter'类似于C,PHP中的'define',但它创建一个新类型的变量像'int,string',这个'type'似乎像一个Class – waaadim