GO语言函数
func max(num1,num2 int) int{
var result int
if (num1 > num2) {
result = num1
} else {
result = num2
}
return result
}
// 函数返回多个值
func swap(x, y string) (string, string) {
return y, x
}
//函数作为值
getSquareRoot := func(x float32) float32{
return math.Sqrt(x)
}
fmt.Println(getSquareRoot(9))
// 命令返回值
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
- 任意类型的不定参数
func myPrintf(args ...interface{}){
}
- 匿名函数后后面跟上小括号,里面加参数,就可以直接运行
func (name string){
fmt.Println(name)
}("xiaoming")
- Go函数不支持嵌套、重载和默认参数
仅支持:
- 无需声明原型
- 不定长度变参
- 多返回值
- 命名返回值参数
- 匿名函数
- 闭包
- 函数可以作为一种类型使用
- func A(a, b, c int)(int,int,string){}
- 命名返回值
func A()(a,b,c int){ //此时a,b,c已经声明
a,b,c = 1,2,3
return
}
- 不定长参数
func A(a ...int){
fmt.PrintlnI(a) // a是一个slice //值拷贝
}
在不定长参数里面,如果要放其他参数,需要放在不定长参数前面,func A(b string,a …int){}
如果直接把一个slice扔进来,那slice本身是引用传参
int string 等传参是值传参,如果要进行引用传参,可以传指针进来,通过指针间接修改原值
func main(){
a := 1
A(&a)
fmt.Println(a)
}
func A(a *int){
*a = 2
fmt.Println(*a)
}
闭包
func main() {
f := closure(10)
fmt.Println(f(1))
fmt.Println(f(2))
}
func closure(x int) func(int) int {
return func(y int) int {
return x + y
}
}
- defer
执行方式类似其他语言中的析构函数,在函数体执行结束后按照调用顺序的
相反顺序
逐个执行
即使函数发生严重
错误也会执行
支持匿名函数的调用
常用于资源清理、文件关闭、解锁以及记录时间等操作
通过与匿名函数配合可在return之后修改函数计算结果
如果函数体内某个变量作为defer时匿名函数的参数,则在定义defer时即已经获得了拷贝,否则则是引用某个变量的地址
Go没有异常机制,但有panic/recover模式来处理错误
Panic可以在任何地方引发,但recover只有
在defer调用的函数中有效