Go中的函数类型

Go中的函数类型,go,Go,我试图理解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

我试图理解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)
  • 我不确定我做错了什么


    功能类型在中描述为:

    函数类型表示具有相同属性的所有函数的集合 参数和结果类型

    这里清楚地提到,
    具有相同参数和结果类型的函数

    传递给主程序的函数定义和函数所需的定义各不相同。如果您仔细查看下面的函数,您已经将
    t
    作为参数传递给
    test1
    ,它只返回一个值给
    opt
    ,这就是错误的原因

    t(fname,lname)用作值

    第二个错误是:

    无法将myfunc2(类型func(字符串,字符串)字符串)用作类型 test1参数中的func(字符串,字符串)

    因为如果您将传递给
    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)
    
    }
    

    示例

    您有两个不相关的问题

    第一:

  • t(fname,lname)用作值
  • 您试图将
    t(fname,lname)
    的返回值赋给变量,但
    t()
    不返回任何内容

    第二点:

  • 在test1的参数中,不能将myfunc2(类型func(string,string)string)用作类型func(string,string)

  • 这是不言自明的。您试图将一个返回字符串
    func(string,string)string的函数传递给一个期望函数不返回任何内容的函数
    func(string,string)

    nit:因为两个问题的解决方案是相同的(即使
    t
    类型为
    func(string,string)字符串
    ,我不会说它们无关,对吗?:)