在Go中使用闭包时如何从函数类型返回
问题描述:
对于GoLang而言,我是新来的,并且无法弄清楚下面代码中的错误。我想要做的是“创建和动态返回打印机功能”,我得到以下编译错误在Go中使用闭包时如何从函数类型返回
cannot use createPrintFunction("!!!") (type Printer) as type func(string) in argument to Greet2
答
问题是签名不匹配
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
需要Printer
和createPrintFunction
返回Printer
。那么如果Printer
改变的东西仍然会工作。
func Greet2(salutation Salutation, do Printer) string {
return do(salutation.name + " " + salutation.greeting)
}
...但createPrintFunction
产生不使用其参数do
。很难指出它应该做什么,因为这些代码大部分只是直接传递它的参数,或者忽略它们。
无论如何,签名必须匹配。
答
解决方案:
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))
}
请出示Greet2'的'定义。 – Adrian
@adrian添加了Greet2定义 –
'Greet2'将'func(string)'作为其第二个参数,而不是'func(s string)string'的Printer。类型不一样,不可互换。 – Adrian