函数
func 函数名 (形参列表)(返回值类型列表){
执行语句
return 返回值列表
}
如果返回多个值,(返回值类型列表)的小括号必须写
如果返回值只有一个,(返回值类型列表)可以不写()
形参列表:表示函数的输入
函数中的语句:表示为了实现功能代码块
函数可以有返回值,也可以没有
范例
func cal (n1 float64, n2 float64,operator byte) float64{ // n1,n2,operator 形参
var res float64
switch operator {
case '+' :
res = n1 + n2
case '-' :
res = n1 - n2
case '*':
res = n1*n2
case '/':
res =n1/n2
default:
fmt.Println("错误")
}
return res
}
func main() {
result := cal(5.3,2.3,'-') //调用函数
fmt.Println("result",result)
}
utils.go 专门用于定义函数,让其他文件来调用
函数的调用机制
内存:栈区(基本数据)------代码区(编写的代码)----------------堆区(引用数据)
终端输出:
-在调用一个函数时,会给这个函数分配一个新的空间,编译器会通过自身的处理让这个新的空间的和其它的栈空间区分开
-在每个函数对应的栈中,数据空间是空间的,不会混淆
-当一个函数调用完毕后,程序会销毁这个函数对应的空间
递归调用
一个函数在函数体又调用了本身,
执行一个函数时,就创建一个新的受保护的独立空间
函数的局部变量是独立的,不会相互影响
递归必须向退出递归的条件逼近,否则就无限递归
当一个函数执行完毕,或者遇到return就会返回,遵循谁调用就将结果返回给谁,结束时也会被系统销毁
练习1
func sum(n1, n2 float32)float32{ //当n1,n2同种类型时,可只在最后的类型中定义
fmt.Printf("n1 type =%T\n",n1)
return n1+n2
}
func main () {
fmt.Println("sum=",sum(1,2))
}
结果
n1 type =float32
sum= 3
练习2
编写一个函数swap(n1*int,n2*int)可以交换n1和n2的值
交换值必须有星号,星号代表它们指向的值
func swap (n1 *int,n2 *int){
t := *n1 //定义一个临时变量
*n1 = *n2
*n2 = t
}
func main(){
a :=10
b :=20
swap(&a,&b) //因为是指针,所以存放的只能是变量的地址
fmt.Printf("a=%v,b=%v",a,b)
}
Init 函数
每个源文件都包含一个init函数,该函数会在main函数执行前,被Go运行框架调用,也就是说init会在maim函数前被调用
Init函数,通常可以在init函数中完成初始化工作
Init注意事项和细节
如果一个文件,包含全局变量定义,init函数和main函数,则执行的顺序为,
全局变量定义-->init函数-->main函数
全局变量定义最先执行。
其他
Go函数不支持重载
重载:函数名相同,形参个数不同
-函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了,通过该变量可以对函数调用。
-函数既然是数据类型,因此在Go中,可以作为形参,并且调用
-Go支持自定义数据类型
基本语法:type 自定义数据类型名 数据类型
type myint int 此时myint等价于int
type mySum func(int,int)int 此时 mySum 等价于一个函数类型 func (int,int)int
-函数支持对返回值命名
有疑问加站长微信联系(非本文作者)