Go 函数
今天学习一下Go语言的函数,先来个例子
一:函数的声明
func Add(a,b int,c int) (result int,err error){ //1:函数的参数定义和C类别的语言差不多,但是后面多了一个括号,代表的函数的返回值,代替了 C#中的ref和out
if a<0||b<0{
err:=error.New("请输入正整数") //2:当函数中碰到错误信息后,给err变量赋值并返回
return
}
return a+b-c,nil //3:当结果执行完毕后,返回数据,这边返回的数据必须和函数定义的签名相同
} //4:在GO语言中函数的名称(例如Add)有特殊的含义 当函数名称首字母大写时代表着此函数->public 若是小写->private
二:函数的调用
result,err:=Add(2,3,4) //1:函数的返回值是几个就要写几个变量来接收,若是不想要对应的结果,可以用“_”代替 也可以写成"_,err:=Add(2,3,4)"
三:不定参数
含义: 函数传入的参数个数为不定数量,看如下例子
func myfunc(args ...int) { //1:"..."代表的传入的参数是不定的 ,int代表这传入的参数都是int类型的参数
for _, arg := range args {
fmt.Println(arg)
}
} //2:这边的参数其实是一个语法糖,当然...int===》[]int也能够达到一个效果,但是在传递的时候会很不方便
myfunc(2,2,3,4) myfunc([]int{1,2,3,4}) //3:在函数的调用后可以看到第一种会更舒服
上面是只 传递一种类型的不定参数,当然也可以传递不定类型的参数例如
func myFunc(str string,args ...interface{}){ //1:注意一下,有多个参数时,不定参数必须要写在传递函数的末尾处,不能写在前面
for _, arg := range args { //2:interface{} ->代表object 类型是Go语言中的所有类型系统的父类型
switch arg.(type) { //3:arg.(type)-> 获取当前参数的类型
case int:
fmt.Println(arg, "is an int value.")
case string:
fmt.Println(arg, "is a string value.")
case int64:
fmt.Println(arg, "is an int64 value.")
default:
fmt.Println(arg, "is an unknown type.")
}
}
}
四:多返回值
上面已经看到,GO语言中的函数可以返回多个值,func Add(a,b int) (a int,str string){} ,代替了C中必须用指针来完成的工作
五:匿名函数和闭包
a:匿名函数 大概意思就是 函数声明的时候不需要写函数名,上例子
func (a int,str string) int{ //1:匿名函数无需写函数名称
if str=="对折"{
return a/2
}
return a
}(1,"对折") //2:函数写玩之后紧跟(参数列表)直接调用 也可以 f:=func(a int) int{ return a}
b:闭包 ->将一个代码块包含在函数中 看例子
func main() {
var j int = 5
a := func()(func()) { //1:第一个func() 代表一个匿名函数 第二个func()是返回的参数
var i int = 10
return func() {
fmt.Printf("i, j: %d, %d\n", i, j)
}
}()
a() //此处又执行一个函数 10 5
j *= 2
a() //此处又执行一个函数 10 10
}
函数就先学到这里了