常量和变量都是数据的一种载体,数据通过不同的运算符参与运算时,对计算的流程进行一定程度的控制便是流程控制,并且低于较多的数据通过内置容器进行存储,那么之后要干嘛呢?就是通过以上的所有概念进行整合,将其抽象到一个模块中去完成某一功能,这便是本篇的主题——函数

函数,并不是一个新概念,在不同语言中都能听到函数这个名词,那么在Go语言中函数又该如何使用呢?它到底与其他语言又有哪些差异呢?

1、函数定义

Go 语言中,函数定义是以关键字 func 开始,其标准格式如下:

func 函数名(参数列表) (返回参数列表) {
   函数体
}

定义解析:

  • func:函数由关键字 func 开始,来表明这是一个函数。
  • 函数名:函数名称,需符合变量命名规范,函数名和参数列表一起构成了函数签名。在同一个包内不能定义相同的函数名。(记住:Go语言中,是不支持函数重载的!)
  • 参数列表:参数就是一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。
  • 返回类型:函数返回一列值的数据类型。有时是不需要返回值的,此时返回类型可以没有。
  • 函数体:函数定义的代码集合,用来实现具体的函数逻辑。

根据函数参数情况可分为三类,接下来展开具体说明。

  • 固定参数
  • 可变参数
  • 固定参数和可变参数

1.1 固定参数的函数定义

函数定义格式如下:

func 函数名(参数列表) (返回参数列表) {
   函数体
}

例如,两数相乘:

func multipleForTowNum(num1 int, num2 int) int {
	result := num1 * num2
	return result
}

1.2 可变参数的函数定义

Go 语言中还支持另外一种可变参数的函数,其函数定义格式如下:

func 函数名(v...T) (返回参数列表) {
   函数体
}

注:v...T 表明 v 为一个切片,T 为切片中数据的类型。

例如,实现多数相乘:

func multipleForNums(nums ...int) int {
	var result int = 1
	for _, num := range nums {
		result = result * num
	}
	return result
}

其中,nums为切片,用来存放不定长度的int类型数组。

1.3 固定参数和可变参数的函数定义

上面介绍了固定参数、可变参数的定义,如果存在固定参数和可变参数共存的情况,该如何定义呢?

其格式如下:

func 函数名(固定参数列表, v...T) (返回参数列表) {
   函数体
}

例如,在两数相加基础上,再进行多数的相乘:

func multipleForTowNums(num1 int, num2 int, nums ...int) int {
	result := num1 + num2
	for _, num := range nums {
		result = result * num
	}
	return result
}

2、函数分类

函数从大的方面分类两类:自定义函数、内置函数。

2.1 自定义函数

比如,上一小节【函数定义】中的举例函数都属于自定义函数,根据实际需求以关键字 func 开头的函数。另一方面,自定义函数是相对Go 语言内置函数而言,指内置函数以外的函数。

2.2 内置函数

内置函数,是指在使用时无需导入包而直接使用的函数,如 lenappend等。在 Go 语言一共有15个内置函数,如下所示:

函数名

说明

make

为切片、channel类型分配内存并初始化对象。

len

计算数组、切片、映射 map、通道 channel 的长度。

cap

计算数组、切片、通道 channel 的容量。

delete

删除映射 map 中对应的键值对。

append

将数据添加到原切片的末尾。

copy

将原切片的数据复制到新切片中,当新切片的空间不足时直接舍弃多余的数据。

new

为切片、映射 map、通道 channel 类型以外的类型分配内存并初始化对象,返回的类型为指针。

complex

生成一个复数。

real

返回复数的实部。

imag

返回复数的虚部。

print

将信息打印到标准输出。

println

将信息打印到标准输出并换行。

close

用于关闭通道 channel

panic

用于触发宕机。

recover

用于捕获 panic 抛出的异常信息。

3、函数返回值

在1、函数定义中我们知道函数在使用调用时,通常会给调用者返回一个结果,这个结果被称为函数的返回值。

一个函数可以没有返回值,也可以有一个或多个返回值。

3.1 多返回值

例如,将两个数进行交换,并返回交换后的两数:

func swap(x, y string) (string, string) {
	return y, x
}

3.2 空白标识符

_ 是 Go 中的空白标识符。它可以代替任何类型的任何值,用处十分广泛。例如,当我们在调用一个多返回值的函数时,但只会用到其中一部分返回值而又不想凭空多声明多余变量,此时,空白标识符就发挥它的优势了。

例如,上面的两个数交换函数 swap:

package main

import "fmt"

func main() {
	x, _ := swap(1, 5)
	fmt.Println(x)	// 输出:5
}

func swap(x, y int) (int, int) {
	return y, x
}

4、函数使用

接下来,以一个简单示例来说明如何正确的使用函数。

如下所示是一个计算两数最大值的函数 max

package main

import "fmt"

func main() {
	fmt.Print(max(10, 7))
}

// 获取两数的最大值
func max(num1, num2 int) int {
	if num1 > num2 {
		return num1
	} else {
		return num2
	}
}