函数
函数是可以重复调用有一定功能或者作用的代码块,用关键字func定义
01 基本用法
- 定义
语法
func 函数名(参数名 参数类型,参数名 参数类型)(返回值类型){
函数体
return 返回值
}
注意:
函数名,只能是字母数字下划线,且不能以数字开头,建议驼峰体。
如果被调用的函数建议大驼峰体
在同一个包下函数名不能重复
可变长参数只能放在所有参数之后,且只能有一个
返回值是多个时,返回值的类型必须用括号括起来
一般用法
package main
import "fmt"
func main() {
num := Add(1, 2)
fmt.Println(num) // 3
}
func Add(x int, y int)(int){
return x + y
}
参数类型相同时
package main
import "fmt"
func main() {
num := Add(1, 2)
fmt.Println(num) // 3
}
func Add(x, y int)(int){ // x,y都是整型
return x + y
}
可变长参数
package main
import "fmt"
func main() {
num := Add(1, 2, 3, 4)
fmt.Println(num) // 10
}
func Add(x int, y ... int)(int){ // y是切片类型,可变长参数必须放在正常参数的后边,且只能有一个可变长参数
for _, value := range y{
x += y
}
return x
}
指定返回值名字
package main
import "fmt"
func main() {
num := Add(1, 2)
fmt.Println(num) // 3
}
func Add(x, y int)(z int){ // x,y都是整型,相当于z被定义,且为零值
z = x + y
return // 直接return就会把z的最终结果作为返回值返回
}
多个返回值
package main
import "fmt"
func main() {
a, b := Add(1, 2) // 必须要两个变量接收
fmt.Println(num) // 3
}
func Add(x, y int)(int, int){ // x,y都是整型,相当于z被定义,且为零值,且返回值类型,必须用括号括起来
z = x + y
return x, y // 返回值直接用括号隔开
}
02 作用域
全局作用域,所有函数能调用
package main
import "fmt"
var a int = 10
func main() {
fmt.Println(a) // 10
}
func TestFunc(){
fmt.Println(a) //10
}
局部作用域定义声明的变量,只能在局部使用,且在局部作用域里覆盖全局变量
package main
import "fmt"
var a int = 10
func main() {
fmt.Println(a) // 10
}
func TestFunc(){
a := 20
fmt.Println(a) // 20
}
03 函数类型与变量
可以自定义函数类型,且函数可以作为变量使用
自定义函数类型
package main
import "fmt"
func main() {
var b a // 声明一个a函数类型的变量b
b = add // 同类型的变量赋值
fmt.Println(b(1, 2)) // 3
}
type a func(int, int)(int) // a就是一个函数类型
func add(x, y int)(int){ // 函数add是a函数类型的函数
return x + y
}
注意:
函数add就是a函数类型
函数作为参数
package main
import (
"fmt"
)
func main() {
b := PFunc(1, PFFunc)
fmt.Println(b)
}
func PFunc(x int, y func(int)(int))(int) { // 参数y是一个函数
a := y(x)
fmt.Println(a)
return a
}
func PFFunc(z int)(int) {
return z
}
函数作为返回值
package main
import (
"fmt"
)
func main() {
f := FFunc() // f是一个函数
fmt.Println(f()) // 调用函数
}
func FFunc() (func()int) {
return AFunc // 函数AFunc作为返回值
}
func AFunc() int {
return 1
}
04 匿名函数
赋值给一个变量
package main
import (
"fmt"
)
func main() {
a := func(x, y int) (int){
return x + y
}
fmt.Println(a(1, 2))
}
直接调用
package main
import (
"fmt"
)
func main() {
fmt.Println(func(x, y int) (int){
return x + y
}(1, 2))
}
05 闭包函数
一个函数在另一个函数内部,且把内部函数作为返回值返回,内部函数为匿名函数
package main
import (
"fmt"
)
func main() {
b := BIBFunc()
fmt.Println(b(3, 4, 5))
}
func BIBFunc()(func(... int)int) {
k := 0
return func (x ... int) int {
for _, value := range x{
k += value
}
return k
}
}
06 defer
defer会延迟处理,像异步的效果,代码从上到下运行完后,被defer修饰的代码才从下向上运行
package main
import (
"fmt"
)
func main() {
fmt.Println(1)
defer fmt.Println(2)
defer fmt.Println(3)
fmt.Println(4)
} // 结果是1,4,3,2