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

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

创建函数

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

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

语法

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

调用函数

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

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

示例

package mainimport ("fmt"
)func myMessage() {fmt.Println("I just got executed!")
}func main() {myMessage() // 调用函数
}

结果:

I just got executed!

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

示例

package mainimport ("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 mainimport ("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 mainimport ("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 mainimport ("fmt"
)func myFunction(x int, y int) int {return x + y
}func main() {fmt.Println(myFunction(1, 2))
}

结果:

3

命名返回值

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

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

示例

package mainimport ("fmt"
)func myFunction(x int, y int) (result int) {result = x + yreturn
}func main() {fmt.Println(myFunction(1, 2))
}

结果:

3

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

示例

package mainimport ("fmt"
)func myFunction(x int, y int) (result int) {result = x + yreturn result
}func main() {fmt.Println(myFunction(1, 2))
}

将返回值存储在变量中

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

示例

package mainimport ("fmt"
)func myFunction(x int, y int) (result int) {result = x + yreturn
}func main() {total := myFunction(1, 2)fmt.Println(total)
}

多个返回值

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

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

示例

package mainimport ("fmt"
)func myFunction(x int, y string) (result int, txt1 string) {result = x + xtxt1 = y + " World!"return
}func main() {fmt.Println(myFunction(5, "Hello"))
}

结果:

10 Hello World!

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

示例

package mainimport ("fmt"
)func myFunction(x int, y string) (result int, txt1 string) {result = x + xtxt1 = y + " World!"return
}func main() {a, b := myFunction(5, "Hello")fmt.Println(a, b)
}

结果:

10 Hello World!

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

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

示例

package mainimport ("fmt"
)func myFunction(x int, y string) (result int, txt1 string) {result = x + xtxt1 = y + " World!"return
}func main() {_, b := myFunction(5, "Hello")fmt.Println(b)
}

结果:

Hello World!

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

示例

package mainimport ("fmt"
)func myFunction(x int, y string) (result int, txt1 string) {result = x + xtxt1 = y + " World!"return
}func main() {a, _ := myFunction(5, "Hello")fmt.Println(a)
}

递归函数

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

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

示例

package mainimport ("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 mainimport ("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,或者扫描下方二维码,关注公众号,即可获取最新文章。

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/208069.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打不开clickonce问题解决过程

1.用户电脑user文件夹下有xx和xx.1两个账户,原先安装在xx账户下,后修了电脑原数据保留在xx.1,新创建XX,之后clickonce就打不开了表现为没有反应,,删除注册表和appdata都只能正常安装,但是不能打开,没有任何报错,发现在我的电脑下打开有这样的提示,,在用户电脑上没有 尝试通过修…

电大搜题——让学习变得轻松高效

作为一名现代学者,您一定时刻关注着教育领域的进展和创新。今天,我将向大家介绍一个名为“电大搜题”的神奇工具,它将为您的学习之路带来一场完美的革命。 在快节奏的现代社会中,学习已经成为每个人追求成功的必经之路。然而&…

攻防世界-web-Confusion1

1. 题目描述 打开链接,如图 点击Login和Rigister,都报错 但是有提示 指出了flag所在的位置,题目中直接能获取到的信息暂时就这么些了 2. 思路分析 既然告诉了我们flag文件的位置,那么要读取到这个文件,要么是任意文…

设计模式-创建型模式-工厂方法模式

一、什么是工厂方法模式 工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。工厂方法模式是目标是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。…

双流网络论文精读笔记

精读视频:双流网络论文逐段精读【论文精读】_哔哩哔哩_bilibili Two-Stream Convolutional Networks for Action Recognition in Videos 传统的神经网络难以学习到物体的运动信息,双流网络则通过光流将物体运动信息抽取出来再传递给神经网络 给模型提供…

未来制造业的新引擎:工业机器人控制解决方案

制造业正经历着一场革命性的变革 在这个变革的浪潮中,工业机器人成为推动制造业高效生产的关键力量。然而,要发挥机器人的最大潜力,一个强大而智能的控制系统是必不可少的。在这个领域,新一代的工业机器人控制解决方案正崭露头角&…

Gradle常用命令与参数依赖管理和版本决议

一、Gradle 常用命令与参数 本课程全程基于 Gradle8.0 环境 1、Gradle 命令 介绍 gradle 命令之前我们先来了解下 gradle 命令怎么在项目中执行。 1.1、gradlew gradlew 即 Gradle Wrapper,在学习小组的第一课时已经介绍过了这里就不多赘述。提一下执行命令&am…

python解决登录图形验证码

摘要:测试过程中经常遇到图片验证码,以下主要是调用百度OCR图片识别获取验证码,实现登录 1、百度云申请创建应用

Autoware.universe部署06:使用DBC文件进行UDP的CAN通信代码编写

目录标题 一、安装DBC文件编辑工具VectorCANdb二、编写DBC文件2.1 CAN通信协议2.2 编写DBC文件2.2.1 根据CAN协议设置signals2.2.2 设置报文2.2.3 建立节点 三、根据DBC文件编写ROS2驱动程序四、实际通信调试 根据CAN协议编写DBC文件,通过DBC文件编写ROS2包进行UDP通…

【前端】前端监控⊆埋点

文章目录 前端监控分为三个方面前端监控流程异常监控常见的错误捕获方法主要是 try / catch 、window.onerror 和window.addEventListener 等。Promise 错误Vue 错误React 错误 性能监控用户行为监控常见的埋点方案来源 前端监控分为三个方面 异常监控(监控前端页面…

2014年6月18日 Go生态洞察:Go 1.3 版本发布

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

linux之 服务器ping百度能通,ping其他网址不通

表症问题 linux上ping域名解析出来的ip地址不正确 linux服务器ping百度能通,ping其他网址不通 linux上ping域名解析出来的ip地址不正确 ping 百度可以,说明dns解析是没问题的 但是,ping 其他网址不通,说明是 请求的其他网址的问…