// func test(){ // } // func test(a int,b int){ // } // func test(a int, b int) int{ // } func test(a int, b int ) (int,int){ } func test(a,b int){ }
花括号必须与函数声明在同一行,这种写法是错误的
func test() { }
golang函数特点
1 不支持重载,一个包中不能有两个名字一样的函数。
2. 函数也是一种类型,函数可以复制给一个变量。
3.支持匿名函数
4.多值返回
func test(a, b int) int { return a + b } func main() { c := test fmt.Println(c) sum := c(1, 2) fmt.Println(sum) test(10, 20) }
自定义函数类型
package main import "fmt" type ty_func func(int, int) int func add(a, b int) int { return a + b } func operator(op ty_func, a, b int) int { return op(a, b) } func main() { c := add sum := operator(c, 100, 200) fmt.Println(sum) }
函数参数传递方式
1. 值传递
2. 引用传递
注意:无论是值传递,还是引用传递,传递给函数的都是变量的副本,不过,值传递是值的持贝。引用传递是地址的持贝,一般来说,地址持贝更为高效。而值持贝取决于拷贝的对象大小,对象越大,则性能越低。
注意2:map、slice、chan、指针、interface默认以引用的方式传递
命名返回值名称
package main import "fmt" func test(a, b, c int) (he int, cha int) { he = a + b + c cha = a - b - c return } func main() { a, b := test(15, 10, 5) fmt.Println(a) fmt.Println(b) }
_标识符,用来忽略返回值
func main() { _, b := test(15, 10, 5) fmt.Println(b) }
可变参数
练习14:写一个函数add,支持1个或多个int相加,并返回相加结果
package main import ( "fmt" ) func test(a int, age ...int) { var sum = a // fmt.Println(sum) // fmt.Println(len(age)) for n := 0; n < len(age); n++ { sum += age[n] } fmt.Println(sum) } func main() { test(1) test(1, 3, 5) test(2, 4) }
练习15:写一个函数concat,支持1个或多个string相拼接,并返回结果
func concat(age ...string) { var str string for n := 0; n < len(age); n++ { str += age[n] } fmt.Println(str) } func main() { concat("hellow", " world", " go") }
defer
1.当函数返回时,执行defer语句。因此,可以用来做资源清理
2.多个defer语句,按先进后出的方式执行
3.defer语句中的变量,在defer声明时就决定了。
func defer_test() { i := 0 defer fmt.Println(i) i = 10 fmt.Println(i) } func main() { defer_test() }
func defer_test() { i := 3 for n := 0; n <= i; n++ { defer fmt.Println(n) } } func main() { defer_test() }
用途
1. 关闭文件句柄
2. 锁资源释放
3. 数据库连接释放
匿名函数
package main import "fmt" var ( test = func(a, b int) int { return a + b }(10, 20) ) var test1 = func(age ...int) int { var sum int for n := 0; n < len(age); n++ { sum += age[n] } return sum } func main() { c := test fmt.Println(c) d := test1(100, 100, 100) fmt.Println(d) }