在Go中使用闭包时如何从函数类型返回

时间:2017-06-12 17:35:56

标签: go

我是GoLang的新手,无法弄清楚下面代码中的错误。我想要做的是"动态创建并返回打印机功能"

type Salutation struct {  name string   
    greeting string
}

type Printer func(s string) string

func Greet2(salutation Salutation, do func(string)) (string){
    do(salutation.name + " " + salutation.greeting)
    return "Done"
}

func createPrintFunction(custom string) Printer {
    return func(s string) string {
        return "hello"
    }
}

func pluralSightModule1Closures1(w http.ResponseWriter, r *http.Request) {
    var s = Salutation{"Joe", "Hello"}
    res := Greet2(s, createPrintFunction("!!!"))
    w.Header().Set("Content-Type", "application/json")
    w.Write([]byte (res))
}

我收到以下编译错误

 cannot use createPrintFunction("!!!") (type Printer) as type func(string) in argument to Greet2

2 个答案:

答案 0 :(得分:3)

问题是签名不匹配。这包括返回类型。

Greet2想要func(string)createPrintFunction返回func(s string) string。请注意,Greet2没有返回任何内容,但createPrintFunction函数返回一个字符串。

您必须决定如何使它们匹配。您可能希望将Greet2中的返回值用于比#34; Done"更好的内容。

func Greet2(salutation Salutation, do func(string) string) string {
    return do(salutation.name + " " + salutation.greeting)
}

由于您已定义type Printer func(s string) string,因此应始终如一地使用它以避免此类问题。 Greet2 PrintercreatePrintFunction返回Printer。然后,如果Printer更改,事情仍然有效。

func Greet2(salutation Salutation, do Printer) string {
    return do(salutation.name + " " + salutation.greeting)
}

...但do生成的createPrintFunction并未使用其参数。很难建议它应该做什么,因为这些代码中的大部分都直接传递了它的参数,或者忽略了它们。

无论如何,签名必须匹配。

答案 1 :(得分:-1)

解决方案:

func Greet2(salutation Salutation, do Printer) (string){
    return do(salutation.name + " " + salutation.greeting)
}

type Printer func(string) string

func createPrintFunction(custom string) Printer {
    return func(s string) string {
        return s
    }
}

func pluralSightModule1Closures1(w http.ResponseWriter, r *http.Request) {
    var s = Salutation{"Joe", "Hello"}
    res := Greet2(s, createPrintFunction("!!!"))
    w.Header().Set("Content-Type", "application/json")
    w.Write([]byte (res))

}