2017-06-12 22 views
1

对于GoLang而言,我是新来的,并且无法弄清楚下面代码中的错误。我想要做的是“创建和动态返回打印机功能”,我得到以下编译错误在Go中使用闭包时如何从函数类型返回

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

请出示Greet2'的'定义。 – Adrian

+0

@adrian添加了Greet2定义 –

+0

'Greet2'将'func(string)'作为其第二个参数,而不是'func(s string)string'的Printer。类型不一样,不可互换。 – Adrian

回答

3

问题是签名不匹配

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

。这包括返回类型。

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

你必须决定如何使它们匹配。您可能想要使用Greet2中的返回值来获得比“完成”更好的结果。

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

...但createPrintFunction产生不使用其参数do。很难指出它应该做什么,因为这些代码大部分只是直接传递它的参数,或者忽略它们。

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

+0

这正是我在评论中写的。 – Adrian

+2

@Adrian这是一个问题解答站点。你可以写一个答案。 ¯\ _(ツ)_ /¯ – Schwern

+0

新增解决方案。如果您同意,请注册。谢谢。 –

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

}