Go 语言函数、参数和返回值详解

小万哥
• 阅读 1179

函数是一组语句,可以在程序中重复使用。函数不会在页面加载时自动执行。函数将通过调用函数来执行。

创建函数

要创建(通常称为声明)一个函数,请执行以下操作:

  • 使用 func 关键字。
  • 指定函数的名称,后跟括号 ()
  • 最后,在花括号 {} 内添加定义函数应执行的代码。

语法

func 函数名() {
   // 要执行的代码
}

调用函数

函数不会立即执行。它们被“保存以供以后使用”,并在调用时执行。

在下面的示例中,我们创建了一个名为 "myMessage()" 的函数。开括号 { 表示函数代码的开始,闭括号 } 表示函数的结束。该函数输出 "I just got executed!"。要调用函数,只需写下函数的名称,后面跟着两个括号 ()

示例

package main

import (
   "fmt"
)

func myMessage() {
   fmt.Println("I just got executed!")
}

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

结果:

I just got executed!

一个函数可以被多次调用。

示例

package main

import (
   "fmt"
)

func myMessage() {
   fmt.Println("I just got executed!")
}

func main() {
   myMessage()
   myMessage()
   myMessage()
}

结果:

I just got executed!
I just got executed!
I just got executed!

Go函数命名规则

  • 函数名必须以字母开头。
  • 函数名只能包含字母数字字符和下划线(A-z,0-9 和 _)。
  • 函数名区分大小写。
  • 函数名不能包含空格。
  • 如果函数名由多个单词组成,可以使用多词变量命名的技巧。

参数和参数值

信息可以作为参数传递给函数。参数在函数内部充当变量。

在函数名后面,括号内指定参数及其类型。您可以添加任意数量的参数,只需用逗号分隔即可:

语法

func 函数名(参数1 类型, 参数2 类型, 参数3 类型) {
  // 要执行的代码
}

带参数的函数示例

下面的示例有一个带有一个参数 fname(类型为字符串)的函数。当调用 familyName() 函数时,我们还传递了一个名字(例如,Liam),并且这个名字在函数内部使用,输出多个不同的名字,但相同的姓氏:

示例

package main

import (
   "fmt"
)

func familyName(fname string) {
   fmt.Println("Hello", fname, "Refsnes")
}

func main() {
   familyName("Liam")
   familyName("Jenny")
   familyName("Anja")
}

结果:

Hello Liam Refsnes
Hello Jenny Refsnes
Hello Anja Refsnes

注意:当将参数传递给函数时,它被称为参数。因此,从上面的示例中可以看出:fname 是参数,而Liam、Jenny 和 Anja 是参数值。

多个参数

在函数内部,您可以添加任意数量的参数:

示例

package main

import (
   "fmt"
)

func familyName(fname string, age int) {
   fmt.Println("Hello", age, "岁的", fname, "Refsnes")
}

func main() {
   familyName("Liam", 3)
   familyName("Jenny", 14)
   familyName("Anja", 30)
}

结果:

Hello 3 岁的 Liam Refsnes
Hello 14 岁的 Jenny Refsnes
Hello 30 岁的 Anja Refsnes

希望这些信息能帮助您理解Go语言中的函数、参数和参数值的使用方式。如果您有任何其他问题,请随时提出。

返回值

如果您想让函数返回一个值,您需要定义返回值的数据类型(如int、string等),并在函数内部使用return关键字:

语法

func 函数名(参数1 类型, 参数2 类型) 类型 {
   // 要执行的代码
   return 输出
}

函数返回示例

在下面的示例中,myFunction() 接收两个整数(x 和 y),并返回它们的加法(x + y)作为整数(int):

示例

package main

import (
   "fmt"
)

func myFunction(x int, y int) int {
   return x + y
}

func main() {
   fmt.Println(myFunction(1, 2))
}

结果:

3

命名返回值

在Go中,您可以为函数的返回值命名。

在这里,我们将返回值命名为 result(类型为int),并使用“裸露”的返回(即,我们使用return语句而不指定变量名)返回值:

示例

package main

import (
   "fmt"
)

func myFunction(x int, y int) (result int) {
   result = x + y
   return
}

func main() {
   fmt.Println(myFunction(1, 2))
}

结果:

3

上面的示例也可以像这样写。在这里,return语句指定了变量名:

示例

package main

import (
   "fmt"
)

func myFunction(x int, y int) (result int) {
   result = x + y
   return result
}

func main() {
   fmt.Println(myFunction(1, 2))
}

将返回值存储在变量中

您也可以将返回值存储在变量中,像这样:

示例

package main

import (
   "fmt"
)

func myFunction(x int, y int) (result int) {
   result = x + y
   return
}

func main() {
   total := myFunction(1, 2)
   fmt.Println(total)
}

多个返回值

Go函数也可以返回多个值。

在这里,myFunction() 返回一个整数(result)和一个字符串(txt1):

示例

package main

import (
   "fmt"
)

func myFunction(x int, y string) (result int, txt1 string) {
   result = x + x
   txt1 = y + " World!"
   return
}

func main() {
   fmt.Println(myFunction(5, "Hello"))
}

结果:

10 Hello World!

在这里,我们将两个返回值存储在两个变量(a 和 b)中:

示例

package main

import (
   "fmt"
)

func myFunction(x int, y string) (result int, txt1 string) {
   result = x + x
   txt1 = y + " World!"
   return
}

func main() {
   a, b := myFunction(5, "Hello")
   fmt.Println(a, b)
}

结果:

10 Hello World!

如果由于某种原因不想使用其中一些返回的值,可以添加下划线( _)来省略这个值。

在这里,我们要省略第一个返回的值(result - 存储在变量a中):

示例

package main

import (
   "fmt"
)

func myFunction(x int, y string) (result int, txt1 string) {
   result = x + x
   txt1 = y + " World!"
   return
}

func main() {
   _, b := myFunction(5, "Hello")
   fmt.Println(b)
}

结果:

Hello World!

在这里,我们要省略第二个返回的值(txt1 - 存储在变量b中):

示例

package main

import (
   "fmt"
)

func myFunction(x int, y string) (result int, txt1 string) {
   result = x + x
   txt1 = y + " World!"
   return
}

func main() {
   a, _ := myFunction(5, "Hello")
   fmt.Println(a)
}

递归函数

Go接受递归函数。如果一个函数调用自己并达到一个停止条件,那么这个函数就是递归的。

在以下示例中,testcount() 是一个调用自己的函数。我们使用x变量作为数据,每次递归时都会增加1(x + 1)。当x变量等于11(x == 11)时,递归结束。

示例

package main

import (
   "fmt"
)

func testcount(x int) int {
   if x == 11 {
      return 0
   }
   fmt.Println(x)
   return testcount(x + 1)
}

func main() {
   testcount(1)
}

结果:

1
2
3
4
5
6
7
8
9
10

递归是一个常见的数学和编程概念。这有利于意味着您可以循环遍历数据以达到一个结果。

开发人员应谨慎使用递归函数,因为很容易陷入编写永远不会终止的函数,或者使用过多的内存或处理器资源的函数。但是,当正确编写时,递归可以是一种非常有效和数学上优雅的编程方法。

在以下示例中,factorial_recursion() 是一个调用自己的函数。我们使用x变量作为数据,每次递归时都会减小1(x - 1)。当条件不大于0时(即当它等于0时),递归结束。

示例

package main

import (
   "fmt"
)

func factorial_recursion(x float64) (y float64) {
   if x > 0 {
      y = x * factorial_recursion(x - 1)
   }

 else {
      y = 1
   }
   return
}

func main() {
   fmt.Println(factorial_recursion(4))
}

结果:

24

希望这些信息对您有所帮助,帮助您理解Go语言中的返回值和递归函数的使用方式。如果您有任何其他问题,请随时提出。

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎 点赞、收藏、关注

点赞
收藏
评论区
推荐文章
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
SQL中的函数
概括:函数是由一个或多个TSQL语句组成的子程序,是一组可用于封闭实现一定功能的程序代码,函数使代码便于重复使用。类别:1、聚合函数聚合函数对一个组值执行计算,并返回单个值。除了COUNT以外,聚合函数都会忽略空置。聚合函数经常与SELECT语句的GROUPBY字句一起使用。常用的聚合函数包括AVC、COUNT、MA
Wesley13 Wesley13
3年前
java多线程相关
Runnablerunnable是线程实现的一种方式(接口实现),它只有一个run()函数,用于将耗时操作写在其中,该函数没有返回值。然后使用某个线程去执行该runnable的实现运行多线程程序,Thread类在调用start()函数后就是执行的是runnable的run()函数。runnable的声明如下:publicinterfac
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Stella981 Stella981
3年前
IDA Pro 权威指南学习笔记(十)
栈帧(stackframe)是在程序的运行时栈中分配的内存块,用于特定的函数调用如果一个函数没有执行则不需要内存,当函数被调用时就需要用到内存1.传给函数的参数的值需要存储到函数能够找到它们的位置2.函数在执行过程中可能需要临时的存储空间,通过声明局部变量来分配这类临时空间,这些变量在函数内部使用,函数调用完后,就无法再访问它们
Wesley13 Wesley13
3年前
Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行。执行顺序优先级:静态块,main(),构造块,构造方法。构造函数publicHelloA(){//构造函数}关于构造函数,以下几点要注意:1.对象一建立,就会调用与之相应的构造
小万哥 小万哥
1年前
Python 函数:定义、调用、参数、递归和 Lambda 函数详解
函数是一段代码块,只有在调用时才会运行。您可以将数据(称为参数)传递给函数。函数可以返回数据作为结果。创建函数在Python中,使用def关键字定义函数:示例pythondefmyfunction():print("Hellofromafunction")
小万哥 小万哥
11个月前
C 语言函数:入门指南
C语言中的函数声明和定义您可以通过以下方式创建并调用函数:c//创建一个函数voidmyFunction()printf("我刚被执行了!");intmain()myFunction();//调用函数return0;一个函数包括两个部分:声明:函数名称、返
小万哥 小万哥
10个月前
C 语言函数完全指南:创建、调用、参数传递、返回值解析
C语言中的函数函数是一段代码块,只有在被调用时才会运行。您可以将数据(称为参数)传递给函数。函数用于执行某些操作,它们对于重用代码很重要:定义一次代码,并多次使用。预定义函数事实证明,您已经知道什么是函数了例如,main()是一个函数,用于执行代码,pri
小万哥 小万哥
9个月前
C# 方法详解:定义、调用、参数、默认值、返回值、命名参数、方法重载全解析
CMethods方法是一段代码,只有在调用时才会运行。您可以将数据(称为参数)传递给方法。方法用于执行某些操作,也被称为函数。为什么使用方法?为了重用代码:定义一次代码,然后多次使用。创建一个方法方法的定义以方法的名称开头,后跟括号()。C提供了一些预定义