当前位置: 首页 > news >正文

学习函数式编程、可变参数及 defer - GO语言从入门到实战

函数是⼀等公⺠、学习函数式编程、可变参数及 defer - GO语言从入门到实战

函数是⼀等公⺠、学习函数式编程、可变参数及 defer

函数是⼀等公⺠

在Go语言中,函数可以分配给一个变量,可以作为函数的参数,也可以作为函数的返回值。这样的行为就可以理解为函数属于一等公民。

与其他主要编程语⾔的差异

  1. 可以有多个返回值:与其他一些编程语言不同,Go语言中的函数可以返回多个值。这使得函数可以更有效地处理和传递多个结果。例如,你可以使用两个变量来接收函数的两个返回值。
package fn_testimport ("fmt"
)
func divideAndRemainder(dividend, divisor int) (int, int) {quotient := dividend / divisorremainder := dividend % divisorreturn quotient, remainder
}a, b := divideAndRemainder(10, 3)
fmt.Println(a, b) // 输出:3 1
  1. 所有参数都是值传递:在Go语言中,函数参数是通过值传递的。当你将一个变量作为参数传递给函数时,函数会创建该变量的一个副本,而不是直接操作原始变量。这有时会让人产生错觉,认为传递的是引用,但实际上是值传递。但是,对于切片(slice)、映射(map)和通道(channel)这样的引用类型,情况会有所不同。它们在函数间传递时会传递引用,而不是复制整个数据。这意味着如果你在函数内部修改了这些类型的参数,会影响原始变量的值。
package fn_testimport ("fmt"
)
func modifySlice(s []int) {s[0] = 100
}nums := []int{1, 2, 3, 4, 5}
modifySlice(nums)
fmt.Println(nums) // 输出:[100 2 3 4 5]
  1. 函数可以作为变量的值:在Go语言中,函数可以作为变量保存和使用。这使得你可以将函数作为参数传递给其他函数,或者将它们赋值给变量。这在实现高阶函数和函数式编程范式时非常有用。
package fn_testimport ("fmt"
)
func add(a, b int) int {return a + b
}addition := add // 将函数add赋值给变量addition
fmt.Println(addition(2, 3)) // 输出:5
  1. 函数可以作为参数和返回值:和其他编程语言一样,Go语言的函数可以作为参数传递给其他函数,也可以作为返回值返回。这种能力使得你可以在函数之间传递和返回操作,从而增强代码的模块化和复用性。

这些特性使得Go语言的函数比其他许多编程语言更加灵活和强大。

函数:可变参数及 defer

可变参数

可变参数允许我们在调用函数时传入任意数量的整数。函数的功能是将所有传入的整数相加,然后返回总和。

package mainimport "fmt"func sum(ops ...int) int {s := 0for _, op := range ops {s += op}return s
}func main() {fmt.Println(sum(1, 2, 3, 4, 5)) // 输出: 15fmt.Println(sum(10, 20, 30))    // 输出: 60
}

在上述例子中,sum函数被调用了两次,每次都传入了一些整数。第一次传入的整数是1, 2, 3, 4, 5,总和是15;第二次传入的整数是10, 20, 30,总和是60。

defer 函数

defer语句可以用来释放资源、关闭文件、打印日志等,它具有很高的灵活性,是Go语言中常用的编程技巧之一。使用defer语句需要注意以下几点:

  1. defer语句必须放在函数内部;
  2. 多个defer语句的执行顺序是与其压入栈中的顺序相反的;
  3. defer语句中的变量在执行时会被记录下来,而不是在执行时读取;
  4. defer语句中的函数会在执行时被调用,而不是在压入栈时调用。
package mainimport "testing"func TestDefer(t *testing.T) {t.Log("Started")defer func() {t.Log("Clear resources")}()// 其他测试代码
}

defer语句位于TestDefer函数的末尾,当这个函数执行结束时,defer语句中的函数将会被执行,打印出"Clear resources"。

下面提供函数应用的代码案例:

package fn_testimport ("fmt""math/rand""testing""time"
)
//函数会生成两个随机数,一个在0到9之间,一个在0到19之间。
func returnMultiValues() (int, int) {return rand.Intn(10), rand.Intn(20)
}//函数接受一个函数作为参数,返回一个新的函数。新函数会计算传入函数的运行时间,并打印出来。
func timeSpent(inner func(op int) int) func(op int) int {return func(n int) int {start := time.Now()ret := inner(n)fmt.Println("time spent:", time.Since(start).Seconds())return ret}
}//函数会让程序暂停1秒,然后返回传入的运算。
func slowFun(op int) int {time.Sleep(time.Second * 1)return op
}//首先调用returnMultiValues函数并打印结果,然后创建了一个新的函数tsSF,它内部调用了slowFun并打印其运行时间,最后调用tsSF函数并打印结果。
func TestFn(t *testing.T) {a, _ := returnMultiValues()t.Log(a)tsSF := timeSpent(slowFun)t.Log(tsSF(10))
}//函数接收任意数量的整数参数,并返回它们的和。
func Sum(ops ...int) int {ret := 0for _, op := range ops {ret += op}return ret
}//函数调用了Sum函数两次,分别传入4个和5个整数,并打印结果。
func TestVarParam(t *testing.T) {t.Log(Sum(1, 2, 3, 4))t.Log(Sum(1, 2, 3, 4, 5))
}//函数打印"Clear resources."。
func Clear() {fmt.Println("Clear resources.")
}//首先打印"Start",然后触发一个panic,最后执行defer Clear(),清除资源。
func TestDefer(t *testing.T) {defer Clear()fmt.Println("Start")panic("err")	//panic是一种用于处理程序错误和异常情况的机制,类似于其他语言的异常
}

学习Go语言主要是多练,多找些代码段写写,不懂可以私聊咨询。
码字不易,如果该文章有用,请多多关注或者赞赏,谢谢!

欢迎关注云尔Websites CSDN博客

相关文章:

学习函数式编程、可变参数及 defer - GO语言从入门到实战

函数是⼀等公⺠、学习函数式编程、可变参数及 defer - GO语言从入门到实战 函数是⼀等公⺠ 在Go语言中,函数可以分配给一个变量,可以作为函数的参数,也可以作为函数的返回值。这样的行为就可以理解为函数属于一等公民。 与其他主要编程语⾔…...

Linux 文件链接

Linux 下的文件链接有两类。一个是类似于 win 电脑的快捷方式,我们称为软链接,软链接也可以叫做符号链接。另一种是通过文件系统的 inode 连接来产生的,类似于 windows 电脑的复制,但是不产生新的文件,我们称为硬链接。…...

1.go web之gin框架

Gin框架 一、准备 1.下载依赖 go get -u github.com/gin-gonic/gin2.引入依赖 import "github.com/gin-gonic/gin"3. (可选)如果使用诸如 http.StatusOK 之类的常量,则需要引入 net/http 包 import "net/http"二、基…...

工程物料管理信息化建设(十二)——关于工程物料管理系统最后的思考

目录 1 功能回顾1.1 MTO模块1.2 请购模块1.3 采购模块1.4 催交模块1.5 现场管理模块1.6 数据分析和看板模块1.7 其它模块 2 最后几个问题2.1 按管线发料和直接发料重叠2.2 YHA 材料编码的唯一性问题2.3 “合同量单-箱单-入库单” 数据映射 3 关于未来的思考3.1 三个专业之间的关…...

什么是API网关?——驱动数字化转型的“隐形冠军”

什么是API网关 API网关(API Gateway)是一个服务器,位于应用程序和后端服务之间,提供了一种集中式的方式来管理API的访问。它是系统的入口点,负责接收并处理来自客户端的请求,然后将请求路由到相应的后端服…...

Java 序列化和反序列化为什么要实现 Serializable 接口?

序列化和反序列化 序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. 什么时候需要用到序列化和反序列化呢或者对象序列化的两种用途… : (1) 对象持久化:把对象的…...

【【萌新的SOC学习之GPIO学习 水】】

萌新的SOC学习之GPIO学习 General Purpose I/O 通用I/O zynq-7000 SOC PS 分为四大部分 APU application Processor UintMemoryIO外设Interconnect 内部互联 PL : IO外设 GPIO可以连接通用的设备(比如按键) 也可以用GPIO模拟其他的协议 GP…...

10-Node.js入门

01.什么是 Node.js 目标 什么是 Node.js,有什么用,为何能独立执行 JS 代码,演示安装和执行 JS 文件内代码 讲解 Node.js 是一个独立的 JavaScript 运行环境,能独立执行 JS 代码,因为这个特点,它可以用来…...

Redis 的过期键 | Navicat 技术干货

Redis 是一种高性能的内存数据存储,以其速度和多功能性而闻名。其中一个有用的特性是为键设置过期时间的功能。在 Redis 中,为键设置过期时间对于管理数据和确保过时或临时数据自动从数据库中删除是至关重要的。在本文中,我们将探讨在 redis-…...

IDC服务器商是如何保护服务器的数据安全

服务器是作为一个公司存储数据和管理服务的设备,随着网络的不断发展大数据的普遍性,所以数据安全问题也越来越受到企业和个体的重视,那么IDC服务器商家是如何对服务器的数据进行安全保护的呢? 配置防火墙。防火墙是服务器的必备工…...

c++中什么时候用double?

c中什么时候用double? 在C中,通常使用double数据类型来表示浮点数,特别是当需要更高的精度时。以下是一些情况下可以考虑使用double的示例: 1. **需要高精度的计算**:当您需要进行精确的浮点数计算时,double通常比flo…...

TCP/IP(四)TCP的连接管理(一)三次握手

一 tcp连接回顾 部分内容来自小林coding TCP篇 记录的目的: 亲身参与进来,加深记忆 ① 引入 前面我们知道: TCP 是面向连接 [点对点的单播]的、可靠的、基于字节流的传输层通信协议面向连接意味着:在使用TCP之前,通信双方必须先建立一…...

bash上下键选择选项demo脚本

效果如下: 废话不多说,上代码: #!/bin/bashoptions("111" "222" "333" "444") # 选项列表 options_index0 # 默认选中第一个选项 options_len${#options[]}echo "请用上下方向键进行选择&am…...

cf 1886A

题目是输入一个数字&#xff0c;分解成三个数字的和&#xff0c;这三个数字都不相同&#xff0c;并且都不可以被三整除&#xff0c;如果存在输出YES并且输出任意一组可能的三个数字&#xff0c;否则输出NO 代码 #include<bits/stdc.h> using namespace std;int main() …...

Spring5应用之事务属性

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言事务…...

C# 搭建一个简单的WebApi项目23.10.10

一、创建Web API 1、创建一个新的web API项目 启动VS 2019&#xff0c;并在“开始页”选择“创建新项目”。或从“文件”菜单选择“新建”&#xff0c;然后选择“项目”。 选择ASP.NET Web应用程序(.NET Framework) 2.点击下一步&#xff0c;到这个页面时选择Web API。 3.选中…...

VGG卷积神经网络实现Cifar10图片分类-Pytorch实战

前言 当涉足深度学习&#xff0c;选择合适的框架是至关重要的一步。PyTorch作为三大主流框架之一&#xff0c;以其简单易用的特点&#xff0c;成为初学者们的首选。相比其他框架&#xff0c;PyTorch更像是一门易学的编程语言&#xff0c;让我们专注于实现项目的功能&#xff0…...

CentOS 7文件系统中的软链接和硬链接

软链接&#xff08;Symbolic Link&#xff09; 软链接&#xff0c;也称为符号链接&#xff0c;是一个指向另一个文件或目录的特殊类型的文件。它是一个指向目标文件的符号&#xff0c;就像快捷方式一样。软链接的创建和使用非常灵活&#xff0c;适用于各种情况。 创建软链接 …...

【AI】深度学习——前馈神经网络——全连接前馈神经网络

文章目录 1.1 全连接前馈神经网络1.1.1 符号说明超参数参数活性值 1.1.2 信息传播公式通用近似定理 1.1.3 神经网络与机器学习结合二分类问题多分类问题 1.1.4 参数学习矩阵求导链式法则更为高效的参数学习反向传播算法目标计算 ∂ z ( l ) ∂ w i j ( l ) \frac{\partial z^{…...

超简单的视频截取方法,迅速提取所需片段!

“视频可以截取吗&#xff1f;用相机拍摄了一段视频&#xff0c;但是中途相机发生了故障&#xff0c;录进去了很多不需要的片段&#xff0c;现在想截取一部分视频出来&#xff0c;但是不知道方法&#xff0c;想问问广大的网友&#xff0c;知不知道视频截取的方法。” 无论是工…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...