函数和异常处理
Go语言函数
说到函数,其实可以把它与Java的方法进行类比,下面是Go语言函数与Java方法的比较
相同点:
- 两者都可以接受参数,并且可以返回结果。
- 两者都可以定义在类/结构体之内,也可以定义在包的外面,作为全局函数/方法。
- 两者都可以进行参数的传值和传引用。
- 两者都可以使用递归实现函数/方法的自我调用。
- 两者都可以把函数/方法(Java8及以上版本)作为一等公民来使用,可以赋值给变量、作为参数传递、作为返回值等等
不同点:
- Go语言中的函数可以独立存在,而Java中的方法必须依附于类或者对象。
- Go语言中的函数可以返回多个值,而Java中的方法只能返回一个值或者返回一个封装多个值的对象。
- Go语言中的函数和Java的方法的参数可以是变长参数,并且只能有一个且只能放在最后,不同点在于Go语言的变长参数是一个切片,而Java的变长参数是一个数组
- Go语言中的函数支持闭包,而Java中的方法不支持。
说完两者之间的异同,接下来我们把Go语言函数比较突出的特点进行梳理一下把
变长参数
Java代码示例:
public static void main(String[] args) {
fun1("1","2");
}
public static void fun1(String ...name) {
System.out.println(name[0]);
// 执行该方法会抛数组越界异常
name[3] = "sdf";
}
Go语言代码示例
func main() {
myFunc1("wangwu", "lisi")
}
func myFunc1(names ...string) {
for i := range names {
fmt.Println(names[i])
}
// 从后面增加一个元素
names = append(names, "zhangsan")
for i := range names {
fmt.Println(names[i])
}
}
一个数组不可变,一个切片(数组可变)
多返回值
对于函数/方法的返回值,很多的语言都是只能返回单个值,例如javascript,C,Java,但是在这里,Go语言就是特立独行,想返回几个就返回几个
func divisor(v1 int, v2 int) (result int, msg string) {
if v2 == 0 {
return -1, "被除数不能为0"
}
return v1 / v2, "success"
}
// 以下为调用
// result, msg := divisor(1, 0)
// fmt.Println("result: ", result, "msg: ", msg)
// result: -1 msg: 被除数不能为0
/// result, msg := divisor(1, 1)
/// fmt.Println("result: ", result, "msg: ", msg)
/// result: 1 msg: success
虽然Go语言没有限定可返回的返回值个数,但是为了便于维护和减少代码的复杂度,多返回值一般为2个到3个即可
闭包
这个概念,没有完全弄明白,可以参考已有大佬的文章 Go语言闭包详解
函数就是参数
在Java8实战中文版这本书中,对Lambda表达式有一个形象的描述 "行为参数化",意思是可以将代码逻辑当作参数传递给方法执行(实际上是调用函数式接口),而对于Go语言来说,就是 "函数就是参数"
package main
import (
"fmt"
)
func compute(operation func(int, int) int, a int, b int) int {
return operation(a, b)
}
func main() {
add := func(a int, b int) int {
return a + b
}
subtract := func(a int, b int) int {
return a - b
}
result1 := compute(add, 10, 5)
fmt.Println("Addition result:", result1)
result2 := compute(subtract, 10, 5)
fmt.Println("Subtraction result:", result2)
}
我们定义了一个名为compute的函数,它将另外一个函数作为参数进行传递。在main函数中,我们定义了两个函数add和subtract,这两个函数都符合参数类型func(int, int) int的定义。我们将这两个函数分别传递给compute函数,并传递了两个整数作为参数,compute函数会根据传递的函数执行相应的操作并返回结果。最终我们输出了两次结果,一次是加法的结果,一次是减法的结果。