Syntax 如何在GO中使用函数类型声明函数

Syntax 如何在GO中使用函数类型声明函数,syntax,go,Syntax,Go,假设您声明了一个函数类型 type mapFunc func(value int) int 您可以使用此类型声明函数而不复制它吗?比如: doubleIt := mapFunc { return 2*value } 据我所知,最短的路仍然是: doubleIt := func (value int) int { return value * 2 } 所以它不会变得更短,而且我不认为将函数签名与其主体解耦会更具可读性。声明命名func类型的好处是在其他声明中使用它 由于以下规

假设您声明了一个函数类型

type mapFunc func(value int) int
您可以使用此类型声明函数而不复制它吗?比如:

doubleIt := mapFunc {
    return 2*value
}

据我所知,最短的路仍然是:

doubleIt := func (value int) int {
    return value * 2
}
所以它不会变得更短,而且我不认为将函数签名与其主体解耦会更具可读性。声明命名func类型的好处是在其他声明中使用它

由于以下规则,不需要像
doubleId:=mapFunc(func…
这样的额外转换:

如果两个函数类型具有相同数量的参数和结果值,则它们是相同的,相应的参数和结果类型是相同的,并且两个函数都是可变的,或者两者都不是。参数名和结果名不需要匹配


据我所知,最短的路仍然是:

doubleIt := func (value int) int {
    return value * 2
}
所以它不会变得更短,而且我不认为将函数签名与其主体解耦会更具可读性。声明命名func类型的好处是在其他声明中使用它

由于以下规则,不需要像
doubleId:=mapFunc(func…
这样的额外转换:

如果两个函数类型具有相同数量的参数和结果值,则它们是相同的,相应的参数和结果类型是相同的,并且两个函数都是可变的,或者两者都不是。参数名和结果名不需要匹配


当然,您可以
func
是一个类似于任何其他预声明类型的类型,尽管以这种方式声明它没有多大意义:

package main

import "fmt"

// You need not a named argument for a named type
type mapFunc func(int) int

func main() {
        doubleIt := mapFunc(func(value int) int { return value * 2})
        fmt.Println(doubleIt(2))      // 4
}

这是为了说明函数只是Go中的另一种类型,可以像任何其他命名类型一样对待。

当然可以
func
是一种类似于任何其他预声明类型的类型,尽管以这种方式声明它没有多大意义:

package main

import "fmt"

// You need not a named argument for a named type
type mapFunc func(int) int

func main() {
        doubleIt := mapFunc(func(value int) int { return value * 2})
        fmt.Println(doubleIt(2))      // 4
}

这是为了说明函数只是Go中的另一种类型,可以像对待任何其他命名类型一样对待。

使用
mapFunc
包装是多余的,因为规则。当@rfalke将函数声明为命名类型时,他在上下文中询问。他可能有特殊用途。这并不常见,只是为了说明他的观点。由于规则的原因,使用
mapFunc
包装是多余的。当@rfalke将函数声明为命名类型时,他在上下文中询问了这个问题。他可能有特殊用途。这并不常见,只是为了说明他的观点。