Go中的函数类型

时间:2018-04-29 15:19:47

标签: 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) {
    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)
}

它会抛出错误。

  
      
  1. t(fname,lname)用作值
  2.   
  3. 不能在test1的参数中使用myfunc2(类型为func(string,string)string)作为类型func(string,string)
  4.   

我不确定我做错了什么。

Playground

2 个答案:

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

}

Playground示例

答案 1 :(得分:4)

你有两个无关的问题。

第一个:

  
      
  1. t(fname,lname)用作值
  2.   

您是否尝试将t(fname, lname)的返回值分配给变量,但t()不会返回任何内容。

第二个:

  
      
  1. 不能在test1的参数中使用myfunc2(类型为func(string,string)string)作为类型func(string,string)
  2.   

非常不言自明。您正在尝试将返回字符串func(string, string) string的函数传递给期望函数不返回func(string, string)的函数。