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

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
云原生网关 MSE Higress,422元/月
简介: 函数是一组语句,可以在程序中重复使用。函数不会在页面加载时自动执行。函数将通过调用函数来执行。

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

创建函数

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

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

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

相关文章
|
21天前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
2月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
2月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
3月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
3月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
271 0
|
8月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
8月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
4月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
4月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。