跳到主要内容

Go 函数

提示
  1. 函数定义和调用:在 Go 中,使用 func 关键字定义函数,并在函数体 {} 中编写具体代码。调用函数时,只需使用函数名加上括号(如 greet())。
  2. 函数参数和返回值:函数可以接受参数,并通过参数执行动态操作。函数可以返回一个或多个值,使用 return 关键字指定返回值。
  3. 函数的好处:函数提高了代码的重用性和可读性,使程序结构更加清晰,有助于维护和调试。

我们使用函数将代码划分为更小的块,使代码看起来更清晰易懂。

基本上,函数是执行特定任务的代码块。例如,假设我们想编写代码来创建一个圆形和矩形并给它们上色。

在这种情况下,我们可以通过创建三个不同的函数来组织我们的代码:

  • 创建圆形的函数
  • 创建矩形的函数
  • 上色的函数

这样,我们的代码将看起来更有组织。此外,我们可以重用同一个函数来给圆形和矩形上色。因此,提供了代码重用性的好处。

创建 Go 函数

在 Golang 中,我们使用 func 关键字来创建函数。

func greet(){
// 代码
}

这里,greet() 是函数的名称(由 () 表示),而 {....} 内的代码表示函数体。

现在,让我们创建一个打印 早上好 的函数。

// 定义函数的程序

package main
import "fmt"

// 定义函数
func greet() {
fmt.Println("Good Morning")
}

func main() {

}

当我们运行这个程序时,我们不会得到输出。

这是因为我们只是定义了一个函数。要执行函数,我们需要首先调用它。

函数调用

我们使用函数名称后跟括号来调用函数。

greet()

现在,让我们在 main() 中添加一个函数调用。

// 定义函数的程序

package main
import "fmt"

// 定义函数
func greet() {
fmt.Println("早上好")
}

func main() {

// 函数调用
greet()

}

输出

早上好

这次函数运行了,我们得到了 早上好 作为输出。

示例:Golang 函数

package main
import "fmt"

// 加两个数的函数
func addNumbers() {
n1 := 12
n2 := 8

sum := n1 + n2
fmt.Println("Sum:", sum)
}

func main() {
// 函数调用
addNumbers()
}

输出

Sum: 20

在上面的例子中,我们创建了一个名为 addNumbers() 的函数。该函数加了两个数字并打印了和。

程序是这样工作的:

要运行一个函数,我们需要调用这个函数。

Golang 中的函数参数

在我们上一个例子中,我们创建了一个只做单一任务的函数,加两个数字 128

func addNumbers() {
n1 := 12
n2 := 8
sum := n1 + n2
fmt.Println("Sum:", sum)
}

然而,在实际项目中,我们希望我们的函数能够动态工作。也就是说,addNumbers() 函数不仅能加 128,还应该能够加任意两个数字。

在这种情况下,我们可以创建接受外部值并对其进行操作的函数。这些额外的参数被称为函数参数。

定义带参数的函数

这是我们如何创建带参数的函数:

func addNumbers(n1 int, n2 int) {
// 代码
}

现在,addNumbers() 函数接受两个参数:n1n2。这里的 int 表示这两个参数都是整数类型。

要调用这个函数,我们需要传递一些值(称为函数参数)。

// 函数调用
addNumbers(21, 13)

这里,2113 是传递给 addNumbers() 函数的函数参数。

示例:函数参数

// 说明函数参数的程序

package main
import "fmt"

// 定义带有 2 个参数的函数
func addNumbers(n1 int, n2 int) {
sum := n1 + n2
fmt.Println("Sum:", sum)
}

func main() {

// 在函数调用中传递参数
addNumbers(21, 13)

}

输出

Sum: 34

程序是这样工作的:

要在函数中传递值,我们使用参数。

当我们调用函数时,参数被赋给函数参数。21 被赋给 n113 被赋给 n2

这就是为什么当我们在函数内加 n1n2 时,我们得到 34 (21 + 13)

注意: 函数参数的数据类型应始终与函数调用期间传递的数据匹配。这里,n1 和 n2 的数据类型是 int,所以我们在函数调用期间传递了整数值 2113

从 Go 函数返回值

在我们最后一个例子中,我们直接在函数内部打印了和的值。然而,我们也可以从函数中返回值,并在程序的任何地方使用它。

这是我们如何创建一个返回值的 Go 函数:

func addNumbers(n1 int, n2 int) int {
// 代码
return sum
}

这里,int 在开括号 { 之前表示函数的返回类型。在这种情况下,int 表示函数将返回一个整数值。

return sum 是返回语句,返回 sum 变量的值。

函数将值返回到调用它的地方,所以我们需要将返回的值存储到一个变量中。

// 函数调用
result := addNumbers(21, 13)

这里,我们将返回值存储到 result 变量中。

示例:函数返回值

package main
import "fmt"

// 函数定义
func addNumbers(n1 int, n2 int) int {
sum := n1 + n2
return sum
}

func main() {

// 函数调用
result := addNumbers(21, 13)

fmt.Println("Sum:",result)
}

输出

Sum: 34

在上面的例子中,当遇到 return 语句时,它返回 sum 的值。返回的值被分配给 main() 中的 result 变量。

程序是这样工作的。当遇到返回语句时,返回语句会返回值。

return 语句应该是函数的最后一个语句。当遇到返回语句时,函数终止。

让我们看一个例子,

package main
import "fmt"

// 函数定义
func addNumbers(n1 int, n2 int) int {
sum := n1 + n2
return sum

// 返回语句后的代码
fmt.Println("After return statement")
}

func main() {

// 函数调用
result := addNumbers(21, 13)
fmt.Println("Sum:",result)

}

我们得到了 "missing return at the end of function" 错误,因为我们在返回语句后添加了一行代码。

从 Go 函数返回多个值

在 Go 中,我们还可以从函数中返回多个值。例如,

// 从函数返回多个值的程序

package main
import "fmt"

// 函数定义
func calculate(n1 int, n2 int) (int, int) {
sum := n1 + n2
difference := n1 - n2

// 返回两个值
return sum, difference
}

func main() {

// 函数调用
sum, difference := calculate(21, 13)

fmt.Println("Sum:", sum, "Difference:", difference)
}

输出

Sum: 34 Difference: 8

在上面的例子中,我们创建了一个名为 calculate() 的函数。

func calculate(n1 int, n2 int) (int, int) {
...
}

这里的 (int, int) 表示我们从函数返回两个整数值:总和和差值。

由于函数返回两个值,我们在调用函数时使用了两个变量。

sum, difference = calculate(21, 13);

使用函数的好处

以下是在编程中使用函数的好处:

1. 代码复用

我们可以在程序中多次复用同一个函数。例如,

// 程序示例:在函数中实现代码复用

package main
import "fmt"

// 函数定义
func getSquare(num int) {
square := num * num
fmt.Printf("%d 的平方是 %d\n", num, square)
}

// 主函数
func main() {

// 调用函数 3 次
getSquare(3)
getSquare(5)
getSquare(10)

}

输出

3 的平方是 9
5 的平方是 25
10 的平方是 100

在上面的程序中,我们创建了名为 getSquare() 的函数来计算一个数的平方。

这里,我们多次复用同一个函数来计算不同数字的平方。

2. 代码可读性

函数帮助我们将代码分割成块,使我们的程序易于阅读和理解。它还使代码更容易维护和调试。