函数函数
——去函数不支持嵌套,重载,和默认参数
——支持以下特性:
——无需声明原型,不定长度变参,多返回值,命名返回值参数,匿名函数,闭包
——定义函数使用关键字函数,且最左括号不能另起一行
——函数也可以作为一种类型使用
# func函数名(参数列表,可为空)(设置可返回值类型,作为可选部分){}
func A1 (int, b字符串)(int,字符串){}//定义返回的类型
func A2 (a, b, c int) (int,字符串){},,//定义函数值都为int类型
func A3 (int, b字符串)(int,字符串){}
# #有命名返回值和不命名返回值区别:
定义多个参数:可用不定常变参
函数主要(){
(1、2、3、4、5、6)
}
func (int) {
fmt.Println (a)
}
值类型传递和片传递区别:
# #函数调用:
package 主要
import “fmt”<>之前func 马克斯(num1 , int, num2 int), int { <>之前,,,,var result int <>之前,,,,if num1 祝辞,num2 { <>之前,,,,,,,,result =, num1 <>之前,,,,},else { <>之前,,,,,,,,result =, num2 <>之前,,,,} <>之前,,,,return 结果
}
func 主要(),{<>之前,,,,var a int =, 100 <>之前,,,,var b int =, 200 <>之前,,,,var ret int <>之前,,,,ret =,马克斯(a, b) <>之前,,,,fmt.Printf(“最大值是:% d \ n”,,随著
}
- <李>
值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
李>
package 主要
import “fmt”<>之前func 主要(),{ <>之前,,,,//var a int =, 100 <>之前,,,,//var b int =, 200 <>之前,,,,myfunc (100,, 200,, 300,, 400,, 500)
}
func myfunc (args …int), {<>之前,,,,fmt.Println (args) <>之前,,,,for _,, arg :=, range args { <>之前,,,,,,,,fmt.Println (arg) <>之前,,,,}
}
匿名函数:
里在去面,函数可以像普通变量一样被传递或使用,去语言支持随时在代码里定义匿名函数,匿名函数由一个不带函数名的函数声明和函数体组成。匿名函数的优越性在于可以直接使用函数内的变量,不必申明。
函数主要(){
:=func(){//函数里没有名字
fmt。Println(“函数”)
}
()
}
FUNC () {
fmt。Println(“函数”)
}
闭包:闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)
函数主要(){
:=clousre (10) {,
fmt.Println (FUNC (1)
fmt.Println (FUNC (2)
}
}
FUNC clousre (int x) FUNC (int) int {
返回FUNC (int y) int {
返回x + y
}
fmt。Println(“函数”)
}
推迟:(调用:先进后出,后进先出原则)
——执行方式类似其他语言中的析构函数,在函数体执行结束后按照调用顺序的相反顺序逐个执行
——即使函数发生严重错误也会执行
——支持匿名函数的调用
——常用于资源清理,文件关闭,锁解以及记录时间等操作
——通过与匿名函数配合可在返回之后修改函数计算结果
——如果函数体内某个变量作为延迟时匿名函数的参数,则在定义推迟时即以获得了拷贝,否则则是引用某个变量的地址
-没我有异常机制,但有恐慌/恢复模式来处理错误
恐慌可以在任何地方引发,但恢复只有在推迟调用的函数中有效
函数主要(){
我:=0;i<3;我+ + {
推迟fmt.Println (i)
}
}
函数主要(){
我:=0;i<3;我+ + {
推迟FUNC () {
fmt.Println (i)} ()
}
}
# #恢复案例
包主要
进口“fmt”
函数主要(){
()
B ()
C ()
}
FUNC () {
fmt。Println(“函数”)
}
func B () {
推迟func () {
如果犯错:=()恢复;犯错!=nil {
fmt。Println (B“恢复”)
}
} ()
恐慌(“B函数”)//如果只有这条,执行到这就停止了
}
函数C () {
fmt。Println (“func C”)