Go语言基础 - 函数

107 阅读3分钟

函数和异常处理

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函数会根据传递的函数执行相应的操作并返回结果。最终我们输出了两次结果,一次是加法的结果,一次是减法的结果。