函数声明
Go语言的每一个函数声明都包含一个函数名、一个形参列表、一个可选的返回列表以及函数体:func name(parameter-list) (result-list) {body}
上述函数声明的语法通式中,若函数仅有一个或没有返回值,返回列表的圆括号可以省略。
函数的类型称作函数签名。当两个函数拥有相同的形参列表和返回列表时(形参和返回值的名字不作为判断依据),这两个函数的类型或签名是相同的。C++中的函数传参可以使用值传递或引用传递,而Go中只有值传递(虽然Go也有引用概念,但与C++并不相同)。
有些函数的声明没有函数体,这说明这个函数使用除了Go以外的语言实现,这样的声明仅定义了该函数的签名。
函数变量
Go语言中的函数也有类型,其零值为nil,而且它们可以赋给变量或者传递或者从其他函数中返回。函数变量可以像其他函数一样调用。
func square(n int) int {
return n * n
}
f := square
fmt.Printf("%T\n", f) //输出 func(int) int
fmt.Println(f(3)) //输出 9
匿名函数
命名函数只能在包级别的作用域中声明,但没有函数名的匿名函数可以在函数体内声明。特别的是,匿名函数能够使用外层函数中的变量:
func squares() func() int {
var x int
return func() int {
x++
return x * x
}
}
func main() {
f := squares()
fmt.Println(f()) // 1
fmt.Println(f()) // 4
fmt.Println(f()) // 9
}
本文部分内容摘自《Go程序设计语言》