在go语言中,经常会看到函数返回值依然是函数的用法,接下来我用一个简单的示例来理解它的用法。
package main
import "fmt"
type myMethod func(a float32, b float32) float32
type inputError struct {
mes string
}
func (e inputError) Error() string {
return fmt.Sprintln("your input must be \"boy\" or \"girl\" ,can not be", e.mes)
}
func main() {
a, err := chooseMethod("boy2")
if err != nil {
fmt.Println(err)
} else {
fmt.Println("the child height will be :", a(170, 180))
}
}
func chooseMethod(child string) (myMethod, error) {
if child == "boy" {
return boyHeight, nil
} else if child == "girl" {
return girlHeight, nil
}
return nil, inputError{child}
}
func boyHeight(momHeight float32, dadHeight float32) float32 {
return (momHeight + dadHeight) / 2 * 1.08
}
func girlHeight(momHeight float32, dadHeight float32) float32 {
return (momHeight + dadHeight) / 2 * 0.94
}
本例实现了一个根据父母的身高求孩子身高的实例,在chooseMethod方法中,根据输入的性别来返回一个求身高的函数,这个函数在前面预定义好了参数和返回值。如果是男孩则返回求男孩身高的函数,女孩则返回求女孩身高的函数,如果都不是则返回error。
这里注意,返回的函数只要符合预定义的myMethod函数,都可以作为返回值。
另外,顺带讲解一下error类型,error在golang中定义为接口,且此接口需要实现Error方法,因此可以自定义error来进行返回。在本例中,inputError定义了Error方法,隐式实现了error接口,因此可以当作error进行返回。