go函数类型
1. 函数
函数是完成某种特定任务的语句集合,例如:main 包里的 main 函数是 go 应用的入口。函数定义的语法如下:
func function_name( [parameter list] ) [return_types] {
body of the function
}
func
定义函数的关键字function_name
函数的名字parameter list
函数接受的参数列表return_types
函数的返回值列表body of function
函数的内容
通过函数名称加上函数需要的参数,就可以调用函数。调用函数时,程序的控制流转移到被调用函数,被调用函数执行完成后,执行结果返回给调用方,并归还控制流。
package main
import "fmt"
func max(a, b int32) int32 {
if a > b {
return a
} else {
return b
}
}
func main() {
var m int32 = 20
var n int32 = 30
var maxValue = max(m, n)
fmt.Printf("max is %d", maxValue)
}
2. 方法
方法(Method)和函数非常相似,只是在函数上加上了接收者(位于func
关键字和函数名之间)。这种设计思路来源于 OOP 里对象方法。
下面例子定义了正方形Rec
,它有两个属性:宽和高。定义了area
函数,它的接收者为Rec
,这时在函数体里,可以直接使用rec
。在调用area
方法时,使用rec.area()
即可。
package main
import "fmt"
type Rec struct {
width int
height int
}
func (rec Rec) area() int {
return rec.width * rec.height
}
func main() {
var rec Rec = Rec{
width: 10,
height: 5,
}
fmt.Printf("the area of rec is %d", rec.area())
}
提示
go 支持指针接收者,这样避免按值拷贝。即:
func (rec *Rec) area() int {
return rec.width * rec.height
}
3. 函数类型
函数类型是具有相同参数、相同返回值的函数的集合。下面例子,定义了参数为string
,返回值为string
的函数类型FunctionType
。可以用FunctionType
定义变量、定义函数参数等。需要注意的是english
这个函数,在代码里面并没有显示的声明它是FunctionType
类型的,但因为它的参数和返回值与FunctionType
的定义一致,故它可以转成FunctionType
(type conversion)。
package main
import "fmt"
type FunctionType func(s string) string
func english(s string) string {
return "say english"
}
func functionTypeParam(f FunctionType) string {
return f("param")
}
func main() {
var f FunctionType = func(s string) string {
return s + "def"
}
fmt.Printf("\n f result %s", f("hello"))
fmt.Printf("\n function type f %s", functionTypeParam(f))
fmt.Printf("\n function type english %s", functionTypeParam(english))
}
需要说明的是:english
的类型并不是FunctionType
(type assertion),例如:
package main
import (
"fmt"
)
type FunctionType func(s string) string
func english(s string) string {
return "say english"
}
func main() {
var a interface{} = english
fmt.Printf("\ntype of a is %T", a)
switch v := a.(type) {
case FunctionType:
fmt.Printf("\nv type is FunctionType %s", v("xx"))
case func(s string) string:
fmt.Printf("\nv type is not FunctionType %s", v("xx"))
}
}