golang函数
2019-12-30 本文已影响0人
程序小白菜
函数是构建 Go 程序的基础部件
函数的定义
func function_name( [parameter list] ) [return_types] {
函数体
}
函数的解析:
- func:函数由 func 开始声明
- function_name:函数名称,函数名和参数列表一起构成了函数签名。
- parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。
- return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况return_types 不是必须的。
- 函数体:函数定义的代码集合。
func subroutine(in int) { return }
func identity(in int) int { return in }
函数的执行顺序
Go语言程序的初始化和执行总是从main.main函数开始的。但是如果main包导入了其它的包,则会按照顺序将它们包含进main包里(这里的导入顺序依赖具体实现,一般可能是以文件名或包路径名的字符串顺序导入)。如果某个包被多次导入的话,在执行的时候只会导入一次。当一个包被导入时,如果它还导入了其它的包,则先将其它的包包含进来,然后创建和初始化这个包的常量和变量,再调用包里的init函数,如果一个包有多个init函数的话,调用顺序未定义(实现可能是以文件名的顺序调用),同一个文件内的多个init则是以出现的顺序依次调用(init不是普通函数,可以定义有多个,所以也不能被其它函数调用)。最后,当main包的所有包级常量、变量被创建和初始化完成,并且init函数被执行后,才会进入main.main函数,程序开始正常执行。
函数的调用-调用函数,向函数传递参数,并返回值
package main
import "fmt"
func main() {
var a, b = 10, 15
var ret int
ret = max(a, b)
fmt.Printf( "最大值是 : %d\n", ret )
}
func max(num1, num2 int) int {
/* 定义局部变量 */
var result int
if (num1 > num2) {
result = num1
} else {
result = num2
}
return result
}
- 递归函数
func rec(i int) {
i f i == 10 {
return
}
rec(i+1)
fmt.Printf("%d ", i)
}
作用域
在 Go 中,定义在函数外的变量是全局的,那些定义在函数内部的变量,对于函数来说
是局部的。如果命名覆盖——一个局部变量与一个全局变量有相同的名字——在函数
执行的时候,局部变量将覆盖全局变量。
package main
import "fmt"
var a int
func main() {
a = 5
fmt.Println(a)
f()
}
func f() {
a := 6
fmt.Println(a)
g()
}
func g() {
fmt.Println(a)
}
多值返回
Go 函数可以返回多个值
package main
import "fmt"
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, b := swap("Google", "Runoob")
fmt.Println(a, b)
}
变参
- 接受不定数量的参数的函数叫做变参函数。定义函数使其接受变参
func myfunc(arg ...int) { }
arg ...int 告诉 Go 这个函数接受不定数量的参数。注意,这些参数的类型全部是 int
- 如果不指定变参的类型,默认是空的接口 interface{}
- 函数的传递方式有两种
值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数
引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
函数的用法
函数用法 | 描述 |
---|---|
函数作为另外一个函数的实参 | 函数定义后可作为另外一个函数的实参数传入 |
闭包 | 闭包是匿名函数,可在动态编程中使用 |
方法 | 方法就是一个包含了接受者的函数 |