函数

函数

函数是一种类型。和其它类型一样,首字母大小写决定是否具有包外可见性。

基本使用 #

1、形参简写和有名返回值
func add(a, b int) (sum int) {
	sum = a + b
	return
}
2、不支持默认参数值
3、不支持命名函数嵌套定义
4、多指返回
func swap(a, b int) (int, int) {return b, a}
5、实参到形参按值传递(传的是值或指针的副本)
6、不定参数
func sum(arr ...int) (sum int){
	for _, v := range arr {
		sum += v
	}
	return
}
注意: (1)不定参数必须是最后一个参数;
(2)不定参数在函数体内相当于切片;
(3)切片可以作为不定参数传给不定参数,切片名后面要加上"...";
(4)形参为不定参数和切片是两种不同的类型。

函数签名 #

函数类型又叫函数签名。可用fmt.printf("%T\n", f)打印函数类型。
可定义有名函数类型。
函数类型是一种引用类型,未初始化时默认值为nil;函数类型变量和函数名都可当作指针变量。

func add(a, b int) int {
    return a + b
}

func main {
    fmt.Printf("%T\n", add)		//func(int, int) int
}

匿名函数 #

Go提供两种函数类型:有名函数和匿名函数。

//匿名函数四种用法:
func doinput(f func(int, int) int, a, b int) int {
    return f(a, b)
}
// 1、直接赋值给变量
var sum = func(a, b int) int { return a + b }
// 2、作为返回值
func wrap() func(int, int) int {
    return func(a, b int) int {
        return a + b
    }
}
// 3、直接被调用
defer func() {
    fmt.Println("Hello func.")
}()
// 4、作为实参
var sum = doinput(func(x, y int) int{
    return x + y
}, 1, 2)	//sum值为3

defer #

defer用于注册多个延迟调用,先进后出;defer后面必须是函数或方法的调用;通常用于资源的释放。

闭包 #

panic和recover #

错误处理 #