Go 语言函数定义_声明_调用(超详细)

发布于: 2020-12-01 20:17:26 作者: 犬小哈 最后修订时间: 2020-12-01 20:17:26

Go 语言中,定义一个函数需要声明参数函数名等。

一、定义一个普通函数

Go 语言中,定义函数需要以 func 标识开头,后面紧接着函数名、参数列表、返回参数列表以及函数体,格式如下:

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

1.1 函数名

函数名的命名有以下约束:

  • 函数名由字母、数字、下划线组成;
  • 函数名不能以数字开头;
  • 同一包内,函数名不能重名。

1.2 参数列表

参数列表中声明的每一个参数由变量名和参数类型组成,示例代码如下:

func foo(a int, b string)

注意,参数列表中的变量以局部变量的方式存在。

1.3 返回参数列表

可以是返回一个值类型,也可以是一个组合,即返回多个参数。另外,当函数中声明了有返回值时,函数体中必须 使用 return 语句提供返回值。

1.4 函数体

函数体表示能够被重复调用的代码片段。

二、参数列表简写

当参数列表中定义了多个参数,且参数类型相同时,代码如下:

func foo(a int, b int) int {
}

上面代码中,变量 a、b 的类型均为整型 int,可以采用以下简写方式:

func foo(a , b int) int {
}

统一定义一个 int 类型即可。

三、函数返回值

在 Go 语言中,返回值支持返回多个,常用场景下,多返回值的最后一个参数会返回函数执行中可能发生的错误,示例代码如下:

conn, err := connectToDatabase()

上面这段代码中,函数 connectToDatabase() 用来获取数据库连接,conn 表示数据库连接,err 用来接收获取过程中可能发生的错误。

3.1 同一类型的返回值

如果函数返回值是统一类型,则用括号将多个返回值括起来,以逗号隔开,示例代码如下:

package main

import "fmt"

func say(name, content string) (string, string) {
	return name, content
}

func main()  {
	name, content := say("犬小哈", "犬小哈教程")

	fmt.Println(name, content)
}

注意:使用 return 语句返回多个值时,值的顺序需要与函数声明的返回值一致。

代码输出如下:

犬小哈 犬小哈教程

图示:

go语言函数定义示例代码

3.2 带有变量名的返回值

Go 语言支持对返回值进行命名,命名后代码的可读性更佳。

命名的返回值默认值为该类型的默认值,例如,若返回值为整型 int,则默认值为 0;若为字符串 string,则默认值为空字符串;布尔为 false; 指针为 nil 等。

下面是代码示例:

func initValue() (a int, b int) {
	a = 1
	b = 2
	return
}

上面这段代码中,函数声明中将返回值变量命名为 a、b,然后在函数体中分别对 a 、 b 进行赋值, 然后使用 return 语句进行返回。

注意: 当函数使用命名进行返回时,可以在 return 语句中不填返回值列表,当然填写也是可以的,上面的代码与下面的代码执行效果相同:

func initValue() (a int, b int) {
	a = 1
	return a, 2
}

四、调用函数

函数在定义以后,要如何调用呢?

函数的调用格式如下:

返回值列表 = 函数名(参数列表)
  • 函数名:需要被调用的函数名;
  • 参数列表: 传入的参数列表,以逗号隔开;
  • 返回值列表:多个返回值以逗号隔开;

下面代码演示如何调用函数:

package main

import "fmt"

func initValue() (a int, b int) {
	a = 1
	return a, 2
}

func main()  {
	// 调用 initValue 函数
	a, b := initValue()
	
	fmt.Println(a, b)
}

代码输出如下:

1 2

PS: 函数内定义的局部变量只能作用在函数体中,函数执行结束后,这些变量都会被释放掉,无法再次访问。

五、结语

本小节中,我们学习了在 Go 语言中要如何定义函数,参数列表的简写,函数的返回值以及如何调用函数,希望小伙伴们学完能有所收获~