Go语言学习之路(八)函数
一、函数定义
1.Go语言函数没有声明,直接定义即可
2.函数定义
func 函数名(形参表){
}
3.不定参数表(args…数据类型)
方法一:
func Test1(args...int){
for i:=0; i < len(args); i++{
fmt.Print(args[i])
}
}
方法二:
func Test(args ...int) {
for i, data := range args {
fmt.Print(i, " ")
fmt.Println(data)
}
}
如果不适用i变量,则可以使用匿名变量:
func Test(args ...int) {
for _, data := range args {
//fmt.Print(i, " ")
fmt.Println(data)
}
}
注意:不定参数一定要放在函数形参表的最后
不定参数根据需要决定传不传参,其他参数必须传参
4.函数嵌套调用
不定参数嵌套
全部传递参数:
func Test3(args...int){
for _, data := range args{
fmt.Println(data)
}
}
funcTest4(args...int){
Test3(args...)
}
传递部分参数;
func Test5(args...int){
for _,data:=range args{
fmt.Println(data)
}
}
func Test6(args...int){
Test5(args[2:]...)
}
表示传递了2(包括2)以后的数据
funcTest5(args...int){
for_,data:=range args{
fmt.Println(data)
}
}
funcTest7(args...int){
Test5(args[:2]...)
}
表示传递了2(不包括2)之前的数据
相当于传递了[a:b]即a(包括a)到 b(不包括b)的数据
不定参数可以不传值,打印为空
二、函数返回值
1.函数返回值写法
第一种:
func AddOne(numOne int, numTwo int) int {
Sum := numOne + numTwo
return Sum
}
第二种:
func AddTwo(numOne int,numTwo int) (Sum int) {
Sum = numOne + numTwo
return Sum
}
第三种:
func AddThree(numOne int,numTwo int) (Sum int) {
Sum = numOne + numTwo
return
}
2.返回多个值
第一种:
func TestOne() (a int,b int,c int) {
a = 1
b = 2
c = 3
return a, b, c
}
var Rone int
//var Rtwo int
var Rthree int
ROne,_,RThree=TestOne()
fmt.Println(ROne,RThree)
第二种:
func TestOne() (a int,b int,c int) {
a = 1
b = 2
c = 3
return
}
var Rone int
//var Rtwo int
var Rthree int
ROne,_,RThree=TestOne()
fmt.Println(ROne,RThree)
匿名变量可以使用多个·,但是使用时不能·出现_,_,_=TestOne(),这样go会认为应该直接使用TestOne(),所以会报错
第三种:
func test()(max,minint){}
三、函数类型
type 类型名 函数名 形参表
type FUNCTYPE func(a int,b int) int
func Add(a int,b int)(sum int){
Sum = a + b
return
}
func main(){
Var Result FUNCTYPE
Result = Add
fmt.Println(Result(1,2))
}
四、函数作用域
1、全局变量
定义在函数体内的变量
var a int
func main(){
a=9
Test()
fmt.Println(a)
}
func Test(){
a=5
a+=1
//fmt.Println(a)
}
结果为6
修改了全局变量
2、局部变量
var a int
func main(){
a := 9
Test()
fmt.Println(a)
}
func Test(){
a=5
a+=1
//fmt.Println(a)
}
结果为9
全局变量与局部变量名称一致时
局部变量优先级高于全局变量
func main(){
a := 9
Test()
fmt.Println(a)
}
func Test(){
a:=5
a+=1
//fmt.Println(a)
}
结果为9
局部变量 Test函数结束后 栈释放
五、匿名函数
所谓匿名函数就是没有名字能够直接在函数体内进行调用的函数
一、匿名函数使用
法一:
法二:
法三:直接调用匿名函数
var num int=9
func(){
num+=1
}()
fmt.Println(num)
匿名函数返回值
x,y:=func(i,j int)(max,min int){
if i<j {
max=j
min=i
}elseifi>j{
max=j
min=i
}else{
fmt.Println("相等")
}
return
}(10,20)
fmt.Println("max:",x)
fmt.Println("min:",y)
匿名函数传参:
法一:
f:=func(a int,b int){
sum:=a+b
fmt.Println(sum)
}
f(10,20)
法二:
func(a int,b int){
sum:=a+b
fmt.Println(sum)
}(10,20)
六、闭包
函数闭包就是以匿名函数作为函数返回值
func main(){
f:=Test()
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
}
func Test() func() int {
var a int=0
return func() int {
a++
return a
}
}
七、递归函数
递归函数就是不断调用自身的函数,下面举例求20的阶乘
Var i int64=1
Var n int64=1
func main(){
Count()
fmt.Println(n)
}
func Count(){
n*=i
i++
if 20>=i{
Count()
}
}