在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进行返回。