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

创建函数

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

  • 使用 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,关注后即可获取最新文章推送

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

Go 语言函数、参数和返回值详解的更多相关文章

  1. ajax中error函数参数与返回值详解 200 300 400 500

    201-206:都表示服务器成功处理了请求的状态代码,说明网页可以正常访问. 200:(成功) 服务器已成功处理了请求.通常,这表示服务器提供了请求的网页. 201:(已创建) 请求成功且服务器已创建 ...

  2. python函数进阶(函数参数、返回值、递归函数)

    函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形 ...

  3. Java和Ibatis调用存储过程并取得返回值详解

    Java和Ibatis调用存储过程并取得返回值详解 2011-07-19 17:33 jiandanfeng2 CSDN博客 字号:T | T 本文主要介绍了Java和Ibatis调用存储过程的方法, ...

  4. javascript函数参数、返回值类型检查

    实现带参数.返回值类型声明的js函数: 类型定义:window.Str = Type.Str = Type.define('STRING', Type.isStr);var Per = Type.de ...

  5. Python基础之函数参数与返回值进阶

    参数作用:如果外界希望在函数内部处理数据,就可以将数据作为参数传入函数内部: 返回值作用:如果希望一个函数函数执行完成后,向外界报告函数的执行结果,就可以使用函数的返回值. 函数的返回值 进阶 利用元 ...

  6. 04 python学习笔记-函数、函数参数和返回值(四)

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print(),我们也可以自己创建函数,这叫做用户自定 ...

  7. JS基础语法---函数---介绍、定义、函数参数、返回值

    函数: 把一坨重复的代码封装,在需要的时候直接调用即可 函数的作用: 代码的重用 函数需要先定义,然后才能使用 函数名字:要遵循驼峰命名法 函数一旦重名,后面的会把前面的函数覆盖 Ctrl +鼠标左键 ...

  8. Java中能否利用函数参数来返回值

    转自https://blog.csdn.net/da_da_xiong/article/details/70039532 我们在写代码时通常会遇到一种情况,就是我们可能希望在一个函数操作完成后返回两个 ...

  9. c++函数参数或返回值为函数指针

    C++中函数指针的形式为:返回值类型 + 参数类型,函数没有值类型,但是却可以声明函数的指针,因为函数是可寻址的,存放在内存中的代码段,可以从指针访问. 函数指针可以声明为: void (*pF)(v ...

  10. Nancy 返回值详解

    简介 Nancy 是一个轻量级的,简单粗暴的framework用来构建基于HTTP的各种服务,兼容.Net和Mono.它的返回值也是多种多样的,适应各种不同的情况.包括Response.AsFile( ...

随机推荐

  1. Python3中的“联动”现象

    技术背景 在python中定义一个列表时,我们一定要注意其中的可变对象的原理.虽然python的语法中没有指针,但是实际上定义一个列表变量时,是把变量名指到了一个可变对象上.如果此时我们定义另外一个变 ...

  2. JavaScript之原生ajax && jQuery之ajax

        ajax提供了异步访问服务器的方法,使页面无须刷新就可以更改页面内容,在实际情况中使用原生的情况较少但是原理需要掌握,一般都是使用jquey更轻量级的实现ajax但是原理是共同的.     原 ...

  3. 【Azure Redis 缓存】Azure Cache for Redis 是否记录具体读/写(Get/Set)或删除(Del)了哪些key呢?

    问题描述 在Azure Redis的门户活动日志中,可以查看到的是对于Redis资源本身的操作.但是对于客户端连接到Redis服务后,对服务所做出的读写,或删除操作,是否有日志可以查看到呢? 问题回答 ...

  4. 16. Class字节码结构

    1. 相关概念 1.1字节码文件的跨平台性 Java 语言是跨平台的(write once, run anywhere) 当 Java 源代码成功编译成字节码后,如果想在不同的平台上面运行, 则无须再 ...

  5. 3、mysql定位低效率执行SQL

    可以通过以下两种方式定位执行效率较低的 SQL 语句. 慢查询日志 : 通过慢查询日志定位那些执行效率较低的 SQL 语句,用--log-slow-queries[=file_name]选项启动时,m ...

  6. 基于STM32F407MAC与DP83848实现以太网通讯一(STM32以太网(ETH)外设)

    STM32F4xx 可以通过以太网按照 IEEE 802.3-2002 标准发送和接收数据.支持与外部物理层 (PHY) 相连的两个工业标准接口:默认情况下使用的介质独立接口 (MII)(在 IEEE ...

  7. Java中枚举配合switch语句用法-2022新项目

    一.业务场景 项目开发中经常会遇到多条件判断的情况,如果判断条件少的话使用if/elseif/else还比较好处理,如果判断条件多的话,则在使用这种语句就不太合适. 如果是自定义的一些内容,比如不同的 ...

  8. 新增、修改校验逻辑使用-Validation-的group分组校验完成-2022新项目

    一.业务场景 一般在项目开发中少不了新增.修改操作,这两个操作中传递的参数中也仅仅只有一个参数是不一致的,新增操作时没有ID, 修改时有ID,其校验逻辑也只有这一个ID校验的差别.最开始自己在写代码时 ...

  9. 使用ScottPlot库在.NET WinForms中快速实现大型数据集的交互式显示

    前言 在.NET应用开发中数据集的交互式显示是一个非常常见的功能,如需要创建折线图.柱状图.饼图.散点图等不同类型的图表将数据呈现出来,帮助人们更好地理解数据.发现规律,并支持决策和沟通.本文我们将一 ...

  10. pandas DataFrame内存优化技巧:让数据处理更高效

    Pandas无疑是我们数据分析时一个不可或缺的工具,它以其强大的数据处理能力.灵活的数据结构以及易于上手的API赢得了广大数据分析师和机器学习工程师的喜爱. 然而,随着数据量的不断增长,如何高效.合理 ...