在之前的教程中,我们讨论了基本的编程概念,例如理解循环或条件语句、声明变量或常量等。在所有用于理解这些概念的程序中,我们都使用了一个函数。该函数名为 main,表示为 main()。在本教程中,您将学习函数的类型、如何创建函数、其返回类型等。
在 Golang 中,程序的执行从主函数 func main() 开始。

一个`函数`是一组相似的语句或逻辑语句的集合。考虑一个简单的日常例子——泡茶。为了泡茶,您需要遵循一系列指令,例如:

因此,如果我们将泡茶视为一个函数,上述步骤是需要分组执行的语句或指令,那么这些语句将每次一起执行。如果泡茶时添加了额外的配料,如姜或小豆蔻等,这些语句(步骤)可能会有一些变化。这些变量可以作为函数的输入。我们将在本教程的后续部分中探讨如何传递这些输入并改变函数流程。
在 Golang 中声明函数时,您应该使用关键字 `func`。
声明函数的语法
func name(parameters){
body of statements
}
其中
注意:需要注意的是,左大括号应与函数名声明在同一行,不能在另一行。
在Go语言中,不像许多其他编程语言那样允许这样做。让我们看一个简单的程序。
package main
import ("fmt")
// main function
func main() {
fmt.Println("I am main function ")
}
输出
I am main function
让我们通过经典的“Hello World”程序来理解函数调用的概念。让我们使用上述语法介绍一个函数 hello,`hello()`。
func hello() {
fmt.Println("Hello, World!")
}
Go 语言函数,带空括号

我们创建了一个函数 hello()。如果您在 Go 程序中运行此代码,它将不会在程序内部执行,因为我们的函数尚未完全定义。为了执行并打印或显示输出,我们需要在程序的主函数 main() 内部调用该函数。
让我们看看如何在 `main()` 函数块内部调用函数 `hello()`。
程序从 `main()` 函数开始执行。`main()` 函数在任何 `package main` 的程序中只出现一次,它不接收也不返回任何参数。以下示例显示了在 `main()` 中调用 `hello()` 函数的完全可执行代码。
调用函数的程序
package main
import "fmt"
func main() { //main function
hello() //calling user defined function named hello
}
func hello() { //created function hello
fmt.Println("Hello World!")
}
输出
Hello, World!
在上一节中,我们讨论了调用带空括号的函数。现在让我们学习如何在已定义的函数括号内使用参数。在括号内定义参数时,还需要指定其对应的数据类型。
Golang 函数,括号内带参数

让我们通过下面的示例程序来理解。该程序有一个名为 `site()` 的函数,括号内定义了两个参数。第一个参数是字符串数据类型,名为 `name`,第二个参数是整数类型,名为 `rept`。当函数 `site("Learn eTutorials", 5)` 被调用时,控制权转移到 `func site`,在那里定义了在 `site` 函数调用期间要执行的指令集。函数体中提供的指令是一个 `for` 循环,它将 `name` 循环 5 次。
package main
import "fmt"
func main() {
site("Learn eTutorial", 5) // calling function with two parameters
}
func site(name string, rept int) {
for i := 0; i < rept; i++ {
fmt.Print("\n ",name)
}
}
输出
Learn eTutorial Learn eTutorial Learn eTutorial Learn eTutorial Learn eTutorial
在 Golang 中,函数可以有任何返回类型,并且可以在函数括号内包含任何类型的参数。下面我们来看看如何声明函数的返回类型。
带返回类型的语法
func name(parameters) <datatype of return type>{
body of statements
}
在上面的语法中,`关键字 func` 定义了一个函数,后跟一个 `函数名`,括号内包含 `参数`,到目前为止这与普通函数声明相似。在此语法中,我们提到了一个新内容,即 `函数的返回类型`,它可以是 int、float、我们在基本 数据类型 中讨论的任何数据类型的字符串。

让我们通过一个程序来理解
package main
import "fmt"
func add(x int, y int) int { //add function
return x + y
}
func sub(x, y int) int { //sub function of omit type
return x - y
}
func main() {
fmt.Println(add(10, 5)) //calling function add
fmt.Println(sub(10, 5)) // calling function sub
}
输出
15 5
注意:当函数参数具有相同数据类型时,可以省略其中一个参数的类型,这称为省略类型。
在上面的程序中,`add()` 和 `sub()` 是两个函数,它们都有两个整数类型的参数。在 `add()` 中,`x` 和 `y` 是整数数据类型的参数,分别在括号内指定为 `int x, int y`。在 `sub()` 中,`x` 和 `y` 两个参数都是整数类型,但只指定了一个参数的数据类型。在这种情况下,如果两个参数具有相同的数据类型,我们可以省略定义其中一个参数的数据类型。

在这种定义风格中,不带数据类型的参数被理解为具有括号内提到的另一个参数的相似数据类型。变量 x 的类型被省略了。
在 Golang 中,函数参数之后,除了函数返回类型外,还可以指定命名返回变量。

让我们通过一个程序来理解
package main
import "fmt"
func add(x int, y int) (a int) { //add function with return type variable a
a = x + y
return
}
func sub(x, y int) (b int) { //sub function of omit type & return variable b
b = x - y
return
}
func main() {
fmt.Println(add(10, 5)) //calling function add
fmt.Println(sub(10, 5)) // calling function sub
}
输出
15 5
上面给出的代码声明了名为 `a` 和 `b` 的整数类型变量,分别用于 `add()` 和 `sub()` 函数。每个函数对应的计算结果存储在变量中,并使用 `return` 关键字返回这些值。一旦 `main()` 函数开始执行,它会调用这些函数并显示如上所示的输出。
注意:从上述程序中我们了解到 Golang 支持函数中的多个参数。在函数括号内部,可以传递多个参数。
没有命名标识符来引用的函数被称为匿名函数。匿名函数接受输入并返回输出,类似于标准函数。
程序匿名函数
package main
import "fmt"
var (
add =func(x int, y int) (a int) { //add function with return type variable a
a=x + y
return
}
)
func main() {
fmt.Println(add(10, 5)) //calling function add
}
输出
15