所有编程语言都有函数的概念。Golang里面,函数有些特殊。
1. 首先,函数也是值。
函数可以拿来当参数,当变量,当... 这些猫哥第一遇到的时候是在JavaScript里。没想到在Golang里又遇到了。感觉Go借鉴了C,借鉴了JavaScript,然而是一种脚本语言。抑或无名函数类似Python中的 lamda?
来看个例子:
package main
import "fmt"
func main() {
myarea := func(x, y float32) float32 {
return (x*y)
}
fmt.Println(myarea(1.1, 2.2))
}
// 输出:
2.42
必须说明的两点:
1) Golang没有float类型,或者float32 或者 float64,只能二选一。
2)如果例子里的类型换成float64,那么结果会是很诡异的 2.4200000000000004 。猫哥在 go1.5.1 windows/amd64上实验的结果。末尾的4不知道怎么出来的。
2. 函数是完全闭包的。
来看一个精心构造的例子(参考了《Go语言半小时速成教程》的一段代码):
package main
import "fmt"
func adder() func(int) int {
sum := 1
return func(x int) int {
sum *= x
return sum
}
}
func main() {
pos, neg := adder(), adder()
for i:=1; i<5; i++ {
fmt.Println(
pos(i),
neg(-1*i),
)
}
}
// 输出结果:
1 -1
2 2
6 -6
24 24
两个函数的执行互不影响,完全各干各的。
3. golang函数可以有多个返回值。
这一点应该是足以让C语言程序员们羡慕不已的了,Perl程序员们笑而不语路过...
第一个例子的小小变形:
package main
import "fmt"
func myfunc (x, y int) (circle, area int) {
return (x+y)*2, x*y
}
func main() {
mylength, myarea := myfunc(4, 6)
fmt.Println(mylength)
fmt.Println(myarea)
}
//输出:
20
24
4. 函数的作用当然远远不止于此,还记得之前谈到过的结构体(struct)吗?Golang让结构体和函数配合,产生了新的功能。当然了,和结构体配合,函数就不再叫函数,而改成——方法(method)。后面会讲到的。
5. Golang的函数可以接受可变参数的例子,其实最开始就遇到了。
比如: fmt.Println("hello" , "world!")
写出来,看起来这样的:
func variousPara(paras ... interface{}) {
fmt.Println(paras)
fmt.Println(reflect.TypeOf(paras))
}