什么是函数

函数用于将您的代码组织成可重用的代码块,这些代码块依次执行特定的任务。

有不同类型的函数,但在这篇文章中,我们只看一个常规函数。函数是使用 func 关键字声明的。

  1. func functionName() {
  2. }

举个例子

函数入门 - 图1

Line 5: We declared a function called greetings. This is a really simple function that just prints “Hello World” to the standard output.

Line 10: Here we call our greetings function. This ends up executing the greetings function’s code block. We can call our function as many times as we like.

方法参数 Function Parameters

greeting() 函数是一个非常基本的函数。但是,在很多情况下,您可能希望将数据提供给函数和/或从中获取数据。在 Go 中,这通常是使用函数参数来完成的。有两种类型的函数参数

  1. func functionName(input-parameters) output-parameters {
  2. ...
  3. }

Input Parameters

Input parameters are defined inside round brackets:

函数入门 - 图2

Line 5: 我们已经指定了两个输入参数,num1 和 num2。您必须为每个输入参数指定其数据类型。在这个例子中,它们都是基于整数的输入参数。

Line 6 输入参数就像函数内部的普通变量一样使用。该函数会自动声明这些变量以供在后面使用,因此不需要像这样显式声明它们:

  1. func add(num1 int, num2 int) {
  2. var num1 int //num1 redeclared in this block
  3. var num2 int
  4. result := num1 + num2
  5. fmt.Println(result)
  6. }

:::info Tip: If all the input parameters are of the same data type, then we can write it in a more shorthand form:

:::

  1. func add(num1, num2 int) {
  2. result := num1 + num2
  3. fmt.Println(result)
  4. }

Line11: 我们在调用 add 函数时传入两个整数参数。如果您未能提供正确的参数,则会收到一条错误消息。

Arguments verses Parameters

There’s a common misconception that “parameters” are “arguments” are names for the same thing. In actual fact, there is a subtle difference between them:

parameters: these are your function’s settings, e.g. num1 and num2.

arguments: these are actual values that you pass into a function via the function’s input parameters, e.g. 2 and 6.

Output Parameters

输出参数用于获取函数返回的数据。

Output parameters are used for getting a function to return some data.

函数入门 - 图3

第 5 行:我们在圆括号后指定了一个输出参数,只需指定其数据类型 int。我们不需要命名我们的输出参数(虽然你可以,我们稍后会介绍)。

第 7 行:我们使用 return 语句指定要通过输出参数发回的数据。函数在 return 执行后立即结束。

第 11 行:这次我们使用 := 将输出参数的数据捕获到名为 totalsum 的变量中。

Functions with multiple return values

您可以为一个函数指定多个输出参数,以便从您的函数中获得多个返回值。

函数入门 - 图4

第 5 行:(int, string) 表示该函数有 2 个输出参数。该函数返回一个 int 值,后跟字符串值。在指定多个输出参数时,您还必须使用圆括号。

第 10-14 行:计算结果除以 2 的余数,然后根据余数是否等于 0 应用 if-else 语句。

第 16 行:return 语句现在需要返回两个值,一个字符串和一个整数,其顺序由第 5 行中定义的输出参数决定。这意味着 return oddOrEven, result

第 20 行:我们的函数旨在返回 2 个值,这就是为什么我们指定了 2 个新变量来捕获这些值,totalsum 和 numberType。Once again the ordering is mirrored。所以totalsum 被赋值为result,NumberType 被赋值为oddOrEven。

具有“命名”返回值的函数

Functions with “named” return values

像输入参数一样,我们可以命名我们的输出参数。

Like input parameters, we can name our output parameters.

函数入门 - 图5

Line 5: 这次我们将输出参数分别命名为 result 和oddOrEven。我们的函数在幕后声明这些变量作为其内部初始化过程的一部分

This time we’ve named our output parameters as result and oddOrEven respectively. Our function declares these variables behind the scenes as part of its internal initialisation process. That is, it runs **var result int** and **var oddOrEven string**.

Line 7: This time we’ve replaced := with =. since the function already declared result for us behind the scenes.

Line 10 and 12: Similarly we don’t have to do var oddOrEven string beforehand, since that’s already done for us behind the scenes.

Line 15: 我们不再需要在 return 语句中明确指定返回值。相反,该函数将恰好返回 result 和oddOrEven 的值。

We no longer need to explicitly specify the return values in our return statement. Instead the function will just return the values of result and oddOrEven.

忽略返回值

Ignoring Returned Values

在某些情况下,我们可能对返回值是什么不感兴趣。在这种情况下,我们可以使用下划线 _ 来丢弃它。

函数入门 - 图6

第 5 行:该函数没有任何输入参数。但它确实有 2 个命名的输出参数。我们使用简写形式编写它,因为所有输出参数都具有相同的数据类型,但如果我们愿意,我们也可以使用简写形式(最喜欢的整数,最不喜欢的整数)

第 11 行:我们使用 _ 来忽略并丢弃通过函数的第二个输出参数返回给我们的值,最不喜欢的

总结

函数是执行特定任务的具体代码块。一个函数可以:

  1. accept 0 or more inputs (aka arguments) with the help of input parameters
  2. run a block of code using those inputs
  3. return 0 or more outputs (aka return values) with the help of output parameters

因此,虽然包声明可让您将代码组织成较小的 .go 文件,但函数可让您在这些 .go 文件中在较低级别组织代码,将它们转换为离散块并使其可重用。

参考资料