我正在尝试理解Go中的函数类型,所以我尝试使用下面的代码。
package main
import "fmt"
func myfn1(i string) {
fmt.Println(i)
}
func myfunc2(firstName string, lastName string) string {
return "Hello "+ firstName + " " + lastName + "!"
}
func test(do func(string), val string) {
do(val)
}
func test1(t func(string,string), fname string, lname string) string {
opt := t(fname, lname)
return opt
}
func main() {
test(myfn1, "Aishu")
greet := test1(myfunc2, "Aishu","S")
fmt.Println(greet)
}
它会抛出错误。
- t(fname,lname)用作值
- 不能在test1的参数中使用myfunc2(类型为func(string,string)string)作为类型func(string,string)
醇>
我不确定我做错了什么。
答案 0 :(得分:5)
函数类型在Golang Spec中描述为:
函数类型表示具有相同功能的所有函数的集合 参数和结果类型。
这里明确提到了same parameter and result types
您传递给主程序有不同的函数定义以及函数所需的定义。如果您仔细查看下面的函数,那么您已将t
作为参数传递给test1
,它返回任何内容,但您将其值分配给opt
,这就是错误的原因。
t(fname,lname)用作值
对于第二个错误,说:
不能使用myfunc2(类型为func(string,string)string)作为类型 test1的参数中的func(string,string)
因为如果您查看作为参数传递给test1
的函数类型,并且您在test1
中定义的参数类型不同。
请查看以下工作代码。
package main
import "fmt"
func myfn1(i string) {
fmt.Println(i)
}
func myfunc2(firstName string, lastName string) string{
return "Hello "+ firstName + " " + lastName + "!"
}
func test(do func(string), val string){
do(val)
}
func test1(t func(string,string) string, fname string, lname string) string{
opt := t(fname,lname)
return opt
}
func main() {
test(myfn1, "Aishu")
greet := test1(myfunc2, "Aishu","S")
fmt.Println(greet)
}
答案 1 :(得分:4)
你有两个无关的问题。
第一个:
- t(fname,lname)用作值
醇>
您是否尝试将t(fname, lname)
的返回值分配给变量,但t()
不会返回任何内容。
第二个:
- 不能在test1的参数中使用myfunc2(类型为func(string,string)string)作为类型func(string,string)
醇>
非常不言自明。您正在尝试将返回字符串func(string, string) string
的函数传递给期望函数不返回func(string, string)
的函数。