// b 参数类型不同funcb(a int, b string){}// c 参数类型相同, 类型简写funcc(a, b string){}
有返回值
// d 确定返回值变量名和类型funcd(a int, b int)(ret int){// 在外层声明了ret, 所以可以直接使用
ret = a + b
return// 声明函数时制定了返回值为 ret, 所以直接 return ret 可以简写为 return}// e 有参数, 有返回值, 只确定返回值类型funce(a int)int{return1}
未知参数数量
funccal(a ...int)int{
ret :=0for_,v :=range a {
ret += v
}return ret
}// 当有固定参数和可变参数同时存在时, 先写固定参数, 再写可变参数funccal2(a int, b ...int)int{
ret := a
for_,v :=range b {
ret += v
}}
多返回值
// 同样有多种写法funccal(a, b,int)(int,int){
sum := a+b
sub := a-b
return sum, sub
}
函数的作用域
package main
import"fmt"var a =100// 函数外层需要使用var定义var b =99funcfuncA(){// 先从局部作用域找变量, 若有, 直接使用, 若没有, 找全局
a :=101
fmt.Println(a, b)}funcmain(){funcA()// 101 99}
函数的进阶
参数为函数
package main
import"fmt"funcsum(x, y int)int{return x + y
}funcsub(x, y int)int{return x - y
}// 定义一个函数, 函数作为参数funccal(x, y int, z func(int,int)int)int{// 需要将作为参数的函数的参数类型和返回值类型都声明清楚returnz(x, y)}funcmain(){
ret1 :=cal(1,2, sum)
fmt.Println(ret1)
ret2 :=cal(2,1, sub)
fmt.Println(ret2)}