Go 语言函数编程指南:定义、调用技巧与返回值机制

 

🐇明明跟你说过:个人主页

🏅个人专栏:《Go语言探索之旅》🏅

🔖行路有良友,便是天堂🔖

目录

一、引言

1、Go语言简介

2、Go语言的特点

二、函数定义

1、Go语言函数定义

2、函数定义的基本格式

3、示例 

1. 无参数无返回值的函数

2. 带参数的函数

3. 带返回值的函数

4. 多返回值的函数

5. 命名返回值

6. 可变参数

7. 匿名函数

​8. 函数作为参数和返回值

9. 函数的闭包

三、函数调用

1、直接调用(Direct Function Call)

2、嵌套调用(Nested Function Call)

3、匿名函数调用(Anonymous Function Call)

4. 匿名函数赋值和调用(Anonymous Function Assignment and Call)


一、引言

1、Go语言简介

Go(也被称为 Golang)是一种由 Google 开发的开源编程语言,设计初衷是为了解决软件开发中的许多问题,尤其是在大规模系统开发中的复杂性、性能和可维护性问题。Go语言自2009年首次发布以来,凭借其简洁、并发友好和高性能等特点,成为了开发现代应用程序、尤其是云计算和微服务架构的流行选择。

2、Go语言的特点

  1. 简洁和易学 Go的语法简洁明了,去除了许多传统语言中的复杂特性(如继承、泛型、匿名类等),使得程序员可以快速上手。
  2. 并发支持 Go语言通过内置的协程(goroutines)和通道(channels)提供了轻量级并发支持,极大地简化了并发编程。通过goroutines,开发者可以轻松创建成千上万的并发任务,而不必担心性能瓶颈。
  3. 高效的性能 Go语言具有接近C语言的运行时性能,适合开发对性能要求较高的应用程序。Go语言是静态类型语言,编译后的代码直接生成机器代码,因此具有较高的执行效率。
  4. 内存管理 Go语言自带垃圾回收(Garbage Collection, GC)机制,简化了内存管理。尽管有GC,Go语言仍然保持较低的内存占用,并能够高效处理大量数据。

 

二、函数定义

1、Go语言函数定义

在Go语言中,函数是最基本的程序单元之一,用于封装某些操作或逻辑。函数通过关键字 func 来定义。Go的函数定义相对简洁,并且没有传统语言中那种繁琐的返回类型声明。

2、函数定义的基本格式

func functionName(parameter1 type1, parameter2 type2, ...) returnType {// 函数体
}

  • func:关键字,用于定义函数。
  • functionName:函数的名称,遵循标识符命名规则。
  • parameter1 type1, parameter2 type2,...:函数的参数列表,每个参数由变量名和类型组成。Go是强类型语言,必须指定参数类型。
  • returnType:函数的返回值类型,若函数没有返回值,则可以省略。
  • 函数体:由大括号 {} 包围,包含了执行的操作。

 

3、示例 

1. 无参数无返回值的函数

一个简单的函数,既没有参数,也没有返回值:

package mainimport "fmt"// 定义一个没有参数和返回值的函数
func sayHello() {fmt.Println("Hello, Go!")
}func main() {sayHello() // 调用函数
}


输出:

Hello, Go!

2. 带参数的函数

函数可以接受一个或多个参数,参数在函数定义时指定类型:

package mainimport "fmt"// 定义一个带参数的函数
func greet(name string) {fmt.Println("Hello, " + name + "!")
}func main() {greet("Alice") // 调用函数并传递参数
}


输出:

Hello, Alice!

3. 带返回值的函数

Go语言函数可以有返回值,返回值通过 return 语句返回。可以定义一个函数返回单个或多个值。

package mainimport "fmt"// 定义一个带返回值的函数
func add(x int, y int) int {return x + y
}func main() {result := add(5, 3)  // 调用函数并获取返回值fmt.Println(result)   // 输出结果
}

输出:

8

4. 多返回值的函数

Go支持函数返回多个值。例如,可以返回计算的结果和错误信息:

package mainimport "fmt"// 定义一个多返回值的函数
func divide(x, y int) (int, error) {if y == 0 {return 0, fmt.Errorf("division by zero") // 返回错误}return x / y, nil
}func main() {result, err := divide(10, 2)if err != nil {fmt.Println("Error:", err)} else {fmt.Println("Result:", result)}
}


输出:

Result: 5

5. 命名返回值

Go语言支持命名返回值,可以在函数签名中直接指定返回值的变量名。这使得返回值在函数中可以直接使用,而不需要在 return 语句中指定。

package mainimport "fmt"// 使用命名返回值
func multiply(x, y int) (result int) {result = x * yreturn // 直接返回命名返回值
}func main() {fmt.Println(multiply(4, 5)) // 输出结果:20
}

6. 可变参数

Go语言允许函数接收一个不定数量的参数,类似于 C 和 Python 的 ... 参数。它允许函数接收传入的参数数量不固定。

package mainimport "fmt"// 定义一个接收不定数量参数的函数
func sum(numbers ...int) int {total := 0for _, num := range numbers {total += num}return total
}func main() {fmt.Println(sum(1, 2, 3))        // 输出 6fmt.Println(sum(4, 5, 6, 7, 8))  // 输出 30
}


7. 匿名函数

Go语言支持匿名函数(lambda表达式)。匿名函数通常用于短期需要的函数,或者用作回调函数。

package mainimport "fmt"func main() {// 定义并立即调用一个匿名函数func() {fmt.Println("This is an anonymous function!")}()// 匿名函数带参数result := func(x, y int) int {return x + y}(5, 7)fmt.Println(result) // 输出 12
}

8. 函数作为参数和返回值

Go支持将函数作为参数传递,也可以返回一个函数。这使得Go在处理回调和高阶函数时非常灵活。

package mainimport "fmt"// 定义一个接收函数作为参数的函数
func applyOperation(x, y int, operation func(int, int) int) int {return operation(x, y)
}func main() {sum := func(a, b int) int {return a + b}result := applyOperation(5, 3, sum)fmt.Println(result) // 输出 8
}


9. 函数的闭包

Go语言支持闭包,闭包是函数与其相关的变量一起创建的,可以记住并操作其创建时的环境。

package mainimport "fmt"// 返回一个闭包函数
func makeMultiplier(factor int) func(int) int {return func(x int) int {return x * factor}
}func main() {multiplyBy2 := makeMultiplier(2)  // 闭包,factor=2fmt.Println(multiplyBy2(5))  // 输出 10multiplyBy3 := makeMultiplier(3)  // 闭包,factor=3fmt.Println(multiplyBy3(5))  // 输出 15
}

三、函数调用

在Go语言中,函数调用有多种形式,包括直接调用、嵌套调用和匿名函数调用。

1、直接调用(Direct Function Call)

直接调用是最常见的函数调用方式,它通过函数名和参数来执行预定义的函数。

示例:

package mainimport "fmt"// 定义一个函数
func greet(name string) {fmt.Println("Hello, " + name)
}func main() {// 直接调用函数greet("Alice")  // 输出:Hello, Alice
}

解释:

greet("Alice") 是一个直接调用,传递 "Alice" 作为参数,执行 greet 函数。

2、嵌套调用(Nested Function Call)

嵌套调用是指在一个函数内调用另一个函数,通常用于在函数内部完成多个操作。Go支持函数嵌套调用,可以通过调用其他函数来实现更加复杂的逻辑。

示例:

package mainimport "fmt"// 定义一个简单的加法函数
func add(a, b int) int {return a + b
}// 定义一个函数,内嵌调用其他函数
func calculate(x, y int) {sum := add(x, y)  // 在calculate函数内调用add函数fmt.Println("The sum is:", sum)
}func main() {calculate(5, 3)  // 输出:The sum is: 8
}

解释:

  • 在 calculate 函数中,调用了 add 函数来计算两个数字的和。
  • 这就是嵌套调用,即一个函数在另一个函数的内部被调用。

3、匿名函数调用(Anonymous Function Call)

匿名函数是没有名称的函数,可以直接定义并执行,或者将其传递给其他函数。Go语言中,匿名函数非常常见,尤其在处理回调和并发时。

示例:

package mainimport "fmt"func main() {// 定义并立即调用匿名函数func() {fmt.Println("This is an anonymous function!")  // 输出:This is an anonymous function!}()
}

解释:

  • func() { ... }() 形式定义并立即调用一个匿名函数。
  • 在定义时没有给匿名函数指定名称,调用时直接加上 () 来执行它。

 

4. 匿名函数赋值和调用(Anonymous Function Assignment and Call)

我们也可以将匿名函数赋值给一个变量,然后通过变量来调用该函数。这种方式常用于回调函数的传递。

示例:

package mainimport "fmt"func main() {// 将匿名函数赋值给变量greet := func(name string) {fmt.Println("Hello, " + name)}// 调用通过变量引用的匿名函数greet("Bob")  // 输出:Hello, Bob
}


解释:

  • greet 变量持有一个匿名函数,你可以像调用普通函数一样通过 greet() 来执行它。

  💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Go语言的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!   

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

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

相关文章

在办公室环境中用HMD替代传统显示器的优势

VR头戴式显示器(HMD)是进入虚拟现实环境的一把钥匙,拥有HMD的您将能够在虚拟现实世界中尽情探索未知领域,正如如今的互联网一样,虚拟现实环境能够为您提供现实中无法实现的或不可能实现的事。随着技术的不断进步&#…

Springboot项目中子模块maven层级不一致的问题

(一)问题描述 campus-common、campus-pojo、campus-server都是campus-flower-system的子模块,但是只有campus-common在campus-flower-system下 (二)解决方法 打开父工程(我这里是campus-flower-system&…

SpringBoot 架构下的在线家具商城:规划与实践之路

第1章 绪论 1.1选题动因 当前的网络技术,软件技术等都具备成熟的理论基础,市场上也出现各种技术开发的软件,这些软件都被用于各个领域,包括生活和工作的领域。随着电脑和笔记本的广泛运用,以及各种计算机硬件的完善和升…

【阅读笔记】Android广播的处理流程

关于Android的解析,有很多优质内容,看了后记录一下阅读笔记,也是一种有意义的事情, 今天就看看“那个写代码的”这位大佬关于广播的梳理, https://blog.csdn.net/a572423926/category_11509429.html https://blog.c…

【C++boost::asio网络编程】有关异步读写api的笔记

异步读写api 异步写操作async_write_someasync_send 异步读操作async_read_someasync_receive 定义一个Session类&#xff0c;主要是为了服务端专门为客户端服务创建的管理类 class Session { public:Session(std::shared_ptr<asio::ip::tcp::socket> socket);void Conn…

Proteus8.17下载安装教程

Proteus是一款嵌入式系统仿真开发软件&#xff0c;实现了从原理图设计、单片机编程、系统仿真到PCB设计&#xff0c;真正实现了从概念到产品的完整设计&#xff0c;其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等&#xff0c;能够帮助用…

frp 内网穿透

文章目录 前言使用自己的服务器搭建frp 这里服务器是linux centos 7 宝塔&#xff0c;client是 windows10 https://github.com/fatedier/frp/releases/tag/v0.53.2 版本下载分客户端与服务端 一、frp是什么&#xff1f;二、使用步骤1.部署服务器端2.客户端 前言 使用自己的服务…

大数据-239 离线数仓 - 广告业务 测试 FlumeAgent 加载ODS、DWD层

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

基于 SpringBoot 开发在线家具商城:设计架构与实践流程

第3章 系统分析 用户的需求以及与本系统相似的在市场上存在的其它系统可以作为系统分析中参考的资料&#xff0c;分析人员可以根据这些信息确定出本系统具备的功能&#xff0c;分析出本系统具备的性能等内容。 3.1可行性分析 尽管系统是根据用户的要求进行制作&#xff0c;但是…

【Django-xadmin】

时间长不用,会忘的系列 1、Django-xadmin后台字段显示处理 主要是修改每个模块下adminx.py文件 代码解释&#xff1a;第1行控制表单字段显示第2行控制列表字段显示第3行控制搜索条件第4行控制过滤条件第5行支持单个或多个字段信息修改第6行列表分页&#xff0c;每页显示多少行…

【HM-React】02. React基础-下

React表单控制 受控绑定 概念&#xff1a;使用React组件的状态&#xff08;useState&#xff09;控制表单的状态 function App(){const [value, setValue] useState()return (<input type"text" value{value} onChange{e > setValue(e.target.value)}/>) …

朗迪锋亮相2024人因工程与智能系统交互国际会议

2024年11月28日至30日&#xff0c;2024人因工程与智能系统交互国际会议在深圳隆重举办。此次大会以推动我国人因工程学科发展为目标&#xff0c;致力于加强国际学术交流&#xff0c;深入探讨人工智能时代的智能系统交互&#xff0c;旨在培育新质生产力&#xff0c;助力经济社会…

基于Java Springboot房屋租赁App且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

【小白学机器学习42】进行多次抽样,样本的分布参数和总体的分布参数的关系

目录 1 进行多次抽样&#xff0c;样本的分布参数和总体的分布参数的关系 2 样本容量越大&#xff0c;多次抽样的样本的分布参数和总体的分布参数的关系 2.1 如果进行多次抽样&#xff0c;样本的均值将趋向总体的均值 2.2 换句话说&#xff1a;样本的均值将趋向总体的均值就…

Spring Web开发(请求)获取JOSN对象| 获取数据(Header)

大家好&#xff0c;我叫小帅今天我们来继续Spring Boot的内容。 文章目录 1. 获取JSON对象2. 获取URL中参数PathVariable3.上传⽂件RequestPart3. 获取Cookie/Session3.1 获取和设置Cookie3.1.1传统获取Cookie3.1.2简洁获取Cookie 3. 2 获取和存储Session3.2.1获取Session&…

CSS学习记录03

CSS背景 CSS 背景属性用于定义元素的背景效果。 CSS background-color background-color属性指定元素的背景色。 页面的背景色设置如下&#xff1a; body {background-color: lightblue; } 通过CSS&#xff0c;颜色通常由以下方式指定&#xff1a; 有效的颜色名称-比如“…

Matlab mex- setup报错—错误使用 mex,未检测到支持的编译器...

错误日志&#xff1a; 在使用mex编译时报错提示&#xff1a;错误使用 mex&#xff0c;未检测到支持的编译器。您可以安装免费提供的 MinGW-w64 C/C 编译器&#xff1b;请参阅安装 MinGW-w64 编译器。有关更多选项&#xff0c;请访问https://www.mathworks.com/support/compile…

STM32CUBEIDE FreeRTOS操作教程(十):interrupt on/off中断开关

STM32CUBEIDE FreeRTOS操作教程&#xff08;十&#xff09;&#xff1a;interrupt on/off中断开关 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发…

Python学习38天

class Person:def __init__(self, name, age, job):self.name nameself.age ageself.job job# 重写函数返回属性def __str__(self):return f"{self.name}--{self.age}--{self.job}"# 冒泡排序法 def bubble_sort(my_list: list[Person]):"""冒泡排…

Python 调用 Umi-OCR API 批量识别图片/PDF文档数据

目录 一、需求分析 二、方案设计&#xff08;概要/详细&#xff09; 三、技术选型 四、OCR 测试 Demo 五、批量文件识别完整代码实现 六、总结 一、需求分析 市场部同事进行采购或给客户报价时&#xff0c;往往基于过往采购合同数据&#xff0c;给出现在采购或报价的金额…