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

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

创建函数

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

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

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

猫不长肉怎么办?增肥效果好、让猫咪迅速圆润起来的猫罐头分享!

秋冬来临,北方的猫咪有暖气还好过一些,南方的猫咪只能依靠自己的抵抗力来过冬。如果不囤点脂肪,怕冷的小猫咪要怎么过冬啊?有些猫咪无论怎么吃也吃不胖,真的让铲屎官很烦恼。想起我新手养猫的那段日子为了给我家猫咪增…

.Net6使用WebSocket与前端进行通信

1. 创建类WebSocketTest: using System.Net.WebSockets; using System.Text;namespace WebSocket.Demo {public class WebSocketTest{//当前请求实例System.Net.WebSockets.WebSocket socket null;public async Task DoWork(HttpContext ctx){socket await ctx.We…

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

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

【tomcat】java.lang.Exception: Socket bind failed: [730048

项目中一些旧工程运行情况处理 问题 1、启动端口占用 2、打印编码乱码 ʮһ�� 13, 2023 9:33:26 ���� org.apache.coyote.AbstractProtocol init ����: Fa…

个人博客项目 - 测试报告

文章目录 一、项目背景二、测试报告功能测试1.编写测试用例2.登录测试3.编写文章测试4.查看文章测试5.删除文章测试7.注销登录测试 自动化测试性能测试1.VUG2.进行场景设计3.生成性能测试报告 总结 本文开始 一、项目背景 通过学习测试相关的知识,动手实践并测试一…

SkyWalking配置报警推送到企业微信

1、先在企业微信群里创建一个机器人,复制webhook的地址: 2、找到SkyWalking部署位置的alarm-settings.yml文件 编辑,在最后面加上此段配置 !!!一定格式要对,不然一直报警报不出来按照网上指导…

强化学习--多维动作状态空间的设计

目录 一、离散动作二、连续动作1、例子12、知乎给出的示例2、github里面的代码 免责声明:以下代码部分来自网络,部分来自ChatGPT,部分来自个人的理解。如有其他观点,欢迎讨论! 一、离散动作 注意:本文均以…

2023年【广东省安全员B证第四批(项目负责人)】报名考试及广东省安全员B证第四批(项目负责人)复审考试

题库来源:安全生产模拟考试一点通公众号小程序 广东省安全员B证第四批(项目负责人)报名考试是安全生产模拟考试一点通总题库中生成的一套广东省安全员B证第四批(项目负责人)复审考试,安全生产模拟考试一点…

Python开发运维:Celery连接Redis

目录 一、理论 1.Celery 二、实验 1.Windows11安装Redis 2.Python3.8环境中配置Celery 三、问题 1.Celery命令报错 2.执行Celery命令报错 3.Win11启动Celery报ValueErro错误 一、理论 1.Celery (1) 概念 Celery是一个基于python开发的分布式系统,它是简单…

redis 高可用

redis 的性能管理:redis的数据缓存在内存当中。 查看redis性能指标:info memory used_ memory:1800800 redis中数据占用的内存 used_ memory_ rss:5783552 redis向操作系统申请的内存 used_ memory_ peak: 1800800 redis使用内存的峰值。 工作有用 …

持续集成失败:hudson.plugins.git.GitException: Failed to delete workspace

持续集成环境(git gitlab jenkins pipeline maven harbor docker k8s)之前都是ok的,突然就报错了: Cloning the remote Git repository Cloning repository git192.168.117.180:qzcsbj/gift.git ERROR: Failed to clean the workspace jenkins.ut…

2023年【安全生产监管人员】考试题及安全生产监管人员找解析

题库来源:安全生产模拟考试一点通公众号小程序 安全生产监管人员考试题参考答案及安全生产监管人员考试试题解析是安全生产模拟考试一点通题库老师及安全生产监管人员操作证已考过的学员汇总,相对有效帮助安全生产监管人员找解析学员顺利通过考试。 1、…

【问题定位】通过看Mybatis源码解决系统问题

开发需求好好的,运维同事突然发现了一个问题,某个任务的详情页面加载不出来。看日志,系统在进行查询操作的时候抛出空指针异常。感觉是Mybatis内部异常,所以就跟踪源码看下Mybatis运行到哪一步报错的。 DefaultSqlSession#select…

LeetCode算法题解(动态规划)|LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树

一、LeetCode343. 整数拆分 题目链接:343. 整数拆分 题目描述: 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入…

【Linux】-进程间通信-共享内存(SystemV),详解接口函数以及原理(使用管道处理同步互斥机制)

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

pyqt5的组合式部件制作(四)

对组合式部件的制作又改进了一版,组合式部件的子部件不再需要单独“提升为”,如果在模板文件的提升部件窗口内选择了“全局包含”,那么只需要在模板文件和应用文件中直接复制粘贴即可,部件的应用更为简便。如下图:按住…

docker、elasticsearch8、springboot3集成备忘

目录 一、背景 二、安装docker 三、下载安装elasticsearch 四、下载安装elasticsearch-head 五、springboot集成elasticsearch 一、背景 前两年研究了一段时间elasticsearch,当时也是网上找了很多资料,最后解决个各种问题可以在springboot上运行了…

>Web 3.0顶级干货教学:浅析区块链与货币关系

Web 3.0顶级干货教学🔥:浅析区块链与货币关系 尊重原创,编写不易 ,帮忙点赞关注一下~转载小伙伴请注明出处!谢谢 1.0 数字交易 最早一笔数字化交易 是在www.PizzaHut.com 在 1994 年产生的,但是有趣的事情…

oracle面试相关的,Oracle基本操作的SQL命令

文章目录 数据库-Oracle〇、Oracle用户管理一、Oracle数据库操作二、Oracle表操作1、创建表2、删除表3、重命名表4、增加字段5、修改字段6、重名字段7、删除字段8、添加主键9、删除主键10、创建索引11、删除索引12、创建视图13、删除视图 三、Oracle操作数据1、数据查询2、插入…

linux部署jar 常见问题

1.java -jar xxx.jar no main manifest attribute, in xxx.jar 一.no main manifest attribute, in xxx.jar 在pom.xml文件中加入&#xff1a; <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifac…