我是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
答案 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
Printer
和createPrintFunction
返回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))
}