一函数
go的函数关键字是func
一般是 func函数名(参数列表)(返回值列表){
函数体
}
参数列表,返回值列表不用可以不写
二 例子
package main
import "fmt"//导入包必须使用,否则编译报错
//无参 无返回值
func MyfunA(){
fmt.Printf("MyfunA\n")
}
//有参无返回值
func MyfunB(str string) {
fmt.Printf("MyfunB,str=%s\n",str)
}
//有参有返回值
func MyfunC(str string)(num int){
fmt.Printf("MyfunC,str=%s\n",str)
num = len(str)
return
//有返回值必须要有return 结束
//不一定要return 返回值,当然你return 也没有什么问题
}
//有参有返回值 和上面一样
func MyfunD(str string)(num int){
fmt.Printf("MyfunD,str=%s\n",str)
return len(str)
//有返回值必须要有return 结束
}
//有参有多个返回值
func MyfunE(str string)(num int, dest string){
fmt.Printf("MyfunE,str=%s\n",str)
return len(str),str
//也可以像func一样将返回值填好就行
//有返回值必须要有return 结束
}
//参数列表
func MyfunF(args ... int)(num int){
fmt.Printf("MyfunF\n")
return len(args)
//返回参数数量
}
func main() {//g语言中的 ‘{’ 不能独占一行
MyfunA()
MyfunB("MyfunB")
num := MyfunC("MyfunC")
fmt.Printf("MyfunC result=%d\n",num)
num = MyfunD("MyfunD")//num 存在 用=
fmt.Printf("MyfunD result=%d\n",num)
len ,str := MyfunE("MyfunE")
fmt.Printf("MyfunE result=%d,%s\n",len,str)
num = MyfunF(1,2,3,4,5,6)
fmt.Printf("MyfunF result=%d\n",num)
//闭包如果修改外部数据,外部再使用是会变的,也就是引用传递
res1,res2 := func(num1,num2 int,str string)(res1 int,res2 string){
res1 = num1 + num2
res2 = str
return
}(1,2,"abc")
fmt.Printf("res1=%d,res2 =%s\n",res1,res2)
}
结果
前后对照,就很清晰了
三 defer
是一个函数栈,先进后出,用于延迟一个函数的执行时间(main函数结束前执行),它一定会执行,哪怕中途崩溃了。
package main
import "fmt"//导入包必须使用,否则编译报错
func main() {//g语言中的 ‘{’ 不能独占一行
fmt.Println("aaa")
defer fmt.Println("bbb")
fmt.Println("ccc")
a :=[]int{1,2}
a[9]=10
fmt.Println("ddd")
}
结果
ccc之后访问非法内存,崩溃,ddd没有打印,但是之前bbb被defer了,所以会执行