变参
接受不定数量参数的函数称为变参函数,定义格式如下:
func myFunc(args … int){ }
args…int 告诉Go这个函数接受不定数量的参数。注意,这些参数的类型全是int,在函数体内,args是一个int型的slice
func sumInt(args ...int) int {
sum := 0
for _, n := range args {
sum += n
}
return sum
}
如果不指定变参的类型,默认是空的接口interface{},假设有另一个变参函数myFunc2,下面的例子演示如何想起传递参数:
func myFunc(args...int) {
myFunc2(args...) <--原样传递
myFunc2(args[:3]...) <--传递部分
}
函数作为值
就像Go中的其他东西一样,函数也是值而已。它可以像下面这样赋值给变量:
func main() {
a := func() {
println("print something")
} <-- 注意这里没有()
a() <--调用函数
}
回调
因为函数可以赋值给变量,所以可以作为参数传递到函数中,然后可以作为回调。比如有一个函数
func printit(x int) {
println(x)
}
这个函数的标识是 func printit(int)或者没有函数名的func(int),创建新的函数,使用这个函数作为回调,需要用到这个标识:
func myFunc(y int, f func(int)) {
f(y)
}
恐慌(Panic)和恢复(Recover)
Go没有像Java那样的异常机制,例如你无法向Java中那样抛出一个异常。作为替代,它使用了恐慌和恢复(Panic-and-Recover)机制。这应当作为最后的手段被指用,代码中应当避免,或者尽量少的出现恐慌代码。应当如何使用它:
panic
是一个内建函数可以中断原有的控制流程,进入一个令人恐慌的流程中。当函数F调用panic函数F的执行被中断,并且F中的延迟函数被执行,然后F返回到调用它的地方。在调用它的地方,F的行为就像调用了一个panic,这一过程继续向上,直到程序崩溃时的所有goroutine返回。
Recover
是一个内建函数。可以让令人恐慌的流程中的routine恢复过来。recover仅在延迟函数中有效,正常执行过程中,recover函数会返回nil并且没有其他任何效果。如果当前的goroutine陷入恐慌,调用recover可以获得panic的输入值,并且恢复正常执行。
下面这个函数检查作为其参数的函数执行时是否会产生panic:
func throwPanic(f func()) (b bool) {
def func(){
if x:= recover && x != nil {
b = true
}
}
f()
return
}