Go基础之函数的用法

本文Demo介绍Go语言函数的使用, 包含多返回值, 闭包, 带参闭包, 函数作为变量的值, 函数的参数为函数, 函数参数为可变参数列表的这几种情况

在Go语言的函数的参数中, 没有Python中类似的默认参数, 可变参数等概念, 只有一个可变参数列表的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package main

import (
"fmt"
)

// 函数的用法

// Go语言支持多返回值, 大多数情况下, 返回两个值, 一个值是结果, 一个值是error
// 如果函数执行正确, error值返回为nil
// 这样在if判断的时候, 就可以判断函数的第二个返回值是否非nil
func FuncDemo5(arg1, arg2 float64) (float64, error) {
if arg2 == 0 {
return float64(0), fmt.Errorf("被除数不能为0")
} else {
return arg1/arg2, nil
}
}

// 函数的用法之闭包
// 闭包的表现形式为函数里返回另外一个匿名函数, 该匿名函数为一个内联的语句或表达式
// func 函数名() 匿名函数() 匿名函数返回值
func FuncDemo6() func() int {
// 在命名函数内声明变量
i := 0
return func() int {
// 在匿名函数中可以直接访问或操作命名函数中定义的变量
i++
return i
}
}

// 带参闭包
func FuncDemo7(arg1, arg2 int) func(arg3, arg4 int) (int, error) {
i := 0
return func(arg3, arg4 int) (int, error) {
i++
sum := arg1 + arg2 + arg3 + arg4 + i
return sum, nil
}
}

// 函数还有一种用法: 作为变量的值
func FuncDemo8(arg1, arg2 int) {

// 声明一个普通变量, 该变量的值为一个函数
result := func(arg3, arg4 int) int {
return arg1 * arg2
}

// 该变量被赋值为一个函数后, 该变量即可被当做其函数调用
r := result(arg1, arg2)
fmt.Println(r)

}

// 函数的参数为函数
func FuncDemo9(arg1, arg2 int) (int, error) {
return arg1 + arg2, nil
}
func FuncDemo10(op func(arg1, arg2 int) (int, error), arg3, arg4 int) (int, error) {
result, err := op(arg3, arg4)
return result, err
}

// 函数的参数为可变参数列表(参数传多少个值都可以)
func FuncDemo11(numbers ...int) (int, error) {
s := 0
for i := range numbers {
s += numbers[i]
}
return s, nil
}

func main() {
if result, err := FuncDemo5(13,6); err != nil {
fmt.Println("Error")
} else {
fmt.Println(result)
}

if result, err := FuncDemo5(13,0); err != nil {
fmt.Println("Error")
} else {
fmt.Println(result)
}

nextValue := FuncDemo6()
fmt.Println(nextValue())
fmt.Println(nextValue())
fmt.Println(nextValue())

nextValue2 := FuncDemo6()
fmt.Println(nextValue2())
fmt.Println(nextValue2())

demo7 := FuncDemo7(5,9)
fmt.Println(demo7(6,13)) // i==1 5+9+6+13+1
fmt.Println(demo7(6,13)) // i==2 5+9+6+13+2
fmt.Println(demo7(10,10)) // i==3 5+9+10+10+3

FuncDemo8(5,6)

fmt.Println(FuncDemo10(FuncDemo9, 5,9))

fmt.Println(FuncDemo11(1,2,3,4,5))
}

执行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
2.1666666666666665
Error
1
2
3
1
2
34 <nil>
35 <nil>
37 <nil>
30
14 <nil>
15 <nil>