2013-08-30 47 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