一、签名
1、go支持函数类型的变量和赋值。例如:
package main
import "fmt"
var pr = fmt.Println
var f = func(){
pr("Hello")
}
var g func()
func main(){
g = f
g()
}
二、参数
1、使用 godoc fmt Println,可以看到它的签名是:
func Println(a ...interface{}) (n int,err error)
这个...表示Println的参数a可以接受多个值,这个interface{}表示a是空界面类型,也就是可以接受几乎所有类型的值。
三、返回语句
1、其实对于每个Go程序,我们都是在利用它的副作用,因为main函数的签名也没有副作用。这和C程序不同。C程序的main函数会返回
一个整数值指出程序的错误。在Go里,这需要用到os包的Exit函数:
func Exit(code int)
四、函数调用
五、闭包
1、我们虽然不可以在一个函数里直接声明另外一个函数,但可以在一个函数中声明一个函数类型的变量。此时的函数称为闭包(closure)。例如:
package main
import "main"
func main(){
add := func(base int) func(int) int {
return func(n int) int {
return base + n
}
}
add5 := add(5)
fmt.Println(add5(10))
}
六、压后
1、压后defer语句注册一个函数。当defer所在函数返回时,调用defer注册的函数。例如
func f(){
err := lock(l)
defer unlock(l)
if err {return}
go()
}
defer确保unlock一定会在f()执行结束时执行。
defer的表达式必须是函数或方法调用。每次defer语句执行时,对函数的参数求值但不会立即调用函数。压后语句注册的函数要等到defer所在的函数返回时,才按照LIFO(后进先出)的次序依次执行。