Go语言中支持函数、匿名函数和闭包,通过func关键字进行定义。
func 函数名(参数)(返回值){
函数体
}
//简单的求和函数
func intSum(x int, y int) int {
return x + y
}
func div(a,b int) (q,r int){
q = a / b
r = a % b
return // 默认是返回q, r
// return q, r
}
字母、数字、下划线
组成。但函数名的第一个字母不能是数字。在同一个包内,函数名也称不能重名参数变量
和参数变量的类型
组成,多个参数之间使用,
分隔。()
包裹,并用,
分隔。·
package main
import "fmt"
//函数:没有默认参数
//没有参数和返回值
func sayHello(){
fmt.Println("hello Peter")
}
//带上参数的函数
func sayHello2(name string){
fmt.Println("hello", name)
}
//定义参数和返回值的函数
//参数类型简写:func intSum (a, b int) int{
func intSum (a int, b int) int{
ret := a + b //声明并且赋值
return ret //返回ret
}
//效果同上:指定了返回值的名称和类型,则函数体内不需要进行
func intSum2 (a int, b int) (ret int){
ret = a + b //直接使用
return //不必写返回,系统自动找到返回值
}
//接收可变参数,参数名后面...表示是可变参数
//可变参数在函数体内是切片类型
func intSum3(a ...int) int {
//fmt.Printf("%T\n", a) //查看a的类型
ret := 0 //类似Python中的sum=0
for _, arg := range a{
ret += arg
}
return ret
}
//同时接收固定和可变参数,可变参数必须在固定参数后面
func intSum4(a int, b...int) int {
//fmt.Printf("%T\n", a) //查看a的类型
ret := a
for _, arg := range b{
ret += arg
}
return ret
}
func main(){
//函数调用
sayHello()
n := "小明"
sayHello2(n)
r := intSum(20,10)
fmt.Println(r)
m := intSum2(20,10)
fmt.Println(m)
//根据传入的参数进行计算
r1 := intSum3()
r2 := intSum3(10)
r3 := intSum3(10,20)
r4 := intSum3(10,20,30)
fmt.Println(r1)
fmt.Println(r2)
fmt.Println(r3)
fmt.Println(r4)
//固定+可变参数
r5 := intSum4(0) //a=0,b=[]
r6 := intSum4(10,20) //a=10,b=20
r7 := intSum4(10,20,30) //a=10,b=[20,30]
fmt.Println(r5)
fmt.Println(r6)
fmt.Println(r7)
}
_
代替;若用于返回错误package main
import "fmt"
//多返回值支持类型简写
func calc(a, b int)(sum, sub int){ //同时定义参数和返回值类型
sum = a + b
sub = a - b
return // 自动返回的是sum和sub
//return sum, sub
}
func main(){
x, y := calc(20,10) //进行返回值的声明和初始化
fmt.Println(x)
fmt.Println(y)
}
defer
语句进行延迟处理倒序
,类似栈
结构,先进后出FILO
defer
语句的倒序输出,其他语句正常顺序package main
import "fmt"
func intSum(a, b int)(ret int){
ret = a + b
return
}
//defer语句的打印输出类似于栈的先进后出FILO
func main(){
fmt.Println("start")
defer fmt.Println("1")
fmt.Println("middle")
defer fmt.Println("2")
x := intSum(10,20)
fmt.Println(x)
defer fmt.Println("3")
fmt.Println("end")
}
//result
start
middle
30
end
3
2
1
在Go
语言的函数中return
语句在底层并不是原子操作,它分为给返回值赋值和RET
指令两步。而defer
语句执行的时机就在返回值赋值操作后,RET
指令执行前