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

Go:error处理机制和函数

文章目录

  • error处理机制
  • 函数
    • 函数作为参数
    • 匿名函数
    • 匿名函数和闭包
    • 闭包运用
    • 闭包与工厂模式

error处理机制

本篇总结的是Go中对于错误的处理机制

Go 语言的函数经常使用两个返回值来表示执行是否成功:返回某个值以及 true 表示成功;返回零值(或 nil)和 false 表示失败

而实际上来说,是需要对于第二个参数进行判断的,比如之前的这个场景

func test1() {str1 := "123"num, _ := strconv.Atoi(str1)fmt.Println(num)
}

这里实际上是忽略了对应的错误信息,只是这里确实没有错误,但是如果真的错误的话,此时给出的结果就是一个不符合预期的结果

func test2() {str1 := "abc"num, _ := strconv.Atoi(str1)fmt.Println(num)
}

在这里插入图片描述

由此可以看出,这个第二个参数实际上是需要被使用的,而常见的判断错误的方式是

func test3(str1 string) {num1, err1 := strconv.Atoi(str1)if err1 != nil {fmt.Println("error!", err1)os.Exit(2)}fmt.Println(num1)
}

运行结果为

在这里插入图片描述

函数

这里很多概念和之前的内容很相似,这里就不再说了,这里重点讲述的是和前面的概念不太相同的地方,做一个举例说明

函数作为参数

package funcpackage// 定义一个加法函数
func add(a, b int) int {return a + b
}// 函数的参数是加法函数
func test1(a int, add func(int, int) int) int {// 内部调用的这个函数return add(a, 2)
}// Test 外层函数调用时,传递参数也要传这个函数
func Test(a int) int {return test1(a, add)
}

这个函数的功能就是,可以传递一个变量进来,之后会把这个参数和加法函数传递给另外一个参数,然后再进行运算返回,在这里这只是一个示例,正常来说也没人会这样进行函数参数的传递

匿名函数

匿名函数的概念并不陌生,它的基本思想就是一个没有名字的函数,比如可能是存在这样的情况

func(x, y int) int { return x + y }

那么,针对于上述的这种场景,实际上是可以直接对于这个函数进行调用的,比如它可能是要这样进行调用:

func test2(a int) int {return func(x, y int) int { return x + y }(a, 2)
}// Test 外层函数调用时,传递参数也要传这个函数
func Test(a int) int {return test2(a)
}

这样就是匿名函数的基本实现,可以理解为是在函数内部直接定义函数,然后直接进行调用,只调用一次,也可以像这样

下面是一个计算从 1 到 100 万整数的总和的匿名函数:

func() {sum := 0for i := 1; i <= 1e6; i++ {sum += i}
}()

下面的例子展示了如何将匿名函数赋值给变量并对其进行调用

package mainimport "fmt"func main() {f()
}
func f() {for i := 0; i < 4; i++ {g := func(i int) { fmt.Printf("%d ", i) }g(i)fmt.Printf("type %T and has value %v\n", g, g)}
}

输出:

type func(int) and has value 0x681a80
type func(int) and has value 0x681b00
type func(int) and has value 0x681ac0
type func(int) and has value 0x681400

所以我们实际上拥有的是一个函数值:匿名函数可以被赋值给变量并作为值使用

匿名函数和闭包

defer 语句和匿名函数

关键字 defer经常配合匿名函数使用,它可以用于改变函数的命名返回值

匿名函数同样被称之为闭包(函数式语言的术语):它们被允许调用定义在其它环境下的变量。闭包可使得某个函数捕捉到一些外部状态,例如:函数被创建时的状态。另一种表示方式为:一个闭包继承了函数所声明时的作用域。这种状态(作用域内的变量)都被共享到闭包的环境中,因此这些变量可以在闭包中被操作,直到被销毁。闭包经常被用作包装函数:它们会预先定义好 1 个或多个参数以用于包装,另一个不错的应用就是使用闭包来完成更加简洁的错误检查

闭包运用

闭包的使用,这里的场景是,将函数作为返回值来进行使用,下面假设有下面的这种场景

// 无参数的函数
func add1() func(a int) int {return func(a int) int { return a + 2 }
}// 有参数的函数
func add2(b int) func(a int) int {return func(a int) int { return a + b }
}// Test 外层函数调用时,传递参数也要传这个函数
func Test() {f1 := add1()f2 := add2(10)res1 := f1(20)res2 := f2(20)fmt.Println(res1, " ", res2)
}

那么对于这个场景来说,函数add1和函数add2的区别是:

  1. 函数add1是无参数的,那么就意味着在调用这个函数的时候不需要传递参数,直接会返回一个可以被直接调用的匿名函数对象,而这个函数对象需要接受一个参数int
  2. 而对于函数add2来说是有参数的,那么就意味着在获取它的返回值的时候就需要提前先传递一个参数进去,这个参数就会绑定到这个匿名函数可调用对象当中,之后在进行调用的时候再进行一次绑定即可

再看一个有意思的调用场景

func f() func(int) int {x := 0return func(a int) int {x += areturn x}
}func test4() {t := f()fmt.Println(t(10))fmt.Println(t(20))fmt.Println(t(30))
}

运行结果实际上是10,30,60,呈现的是一种累加的效果,那为什么会展示出这样的效果呢?

实际上也很好理解,因为t变量本质上是从f返回的一个返回值,也就是说一直调用的是同样的一个函数调用的栈帧,那么在这一个栈帧当中,对于x的值,每次都会进行更新,那么自然呈现出的效果就是累计增加了

闭包与工厂模式

闭包是可以和工厂模式结合的,这是Go语言可以返回函数带来的好处,看下面这样的场景

func factory(str1 string) func(str2 string) string {return func(str2 string) string {return str2 + str1}
}func test5() {func1 := factory(".jpg")func2 := factory(".bmp")fmt.Println(func1("11111"))fmt.Println(func2("22222"))
}

如上所示也是一个比较有意思的使用场景,使用者可以传递一个后缀进去,之后调用的函数都会自动添加上这个后缀

由这些用例其实也能看出,将函数返回的一个巨大好处是可以把函数内部的一些参数动态化,不必必须要提前写死,这样在工厂模式这样的场景下会有其独特的优势

可以返回其它函数的函数和接受其它函数作为参数的函数均被称之为高阶函数,是函数式语言的特点,未来会介绍更多的,与这样的场景相关的场景,Go语言在处理混合对象中尤其独特的强大能力

相关文章:

Go:error处理机制和函数

文章目录 error处理机制函数函数作为参数匿名函数匿名函数和闭包闭包运用闭包与工厂模式 error处理机制 本篇总结的是Go中对于错误的处理机制 Go 语言的函数经常使用两个返回值来表示执行是否成功&#xff1a;返回某个值以及 true 表示成功&#xff1b;返回零值&#xff08;或…...

智能指针(3)

目录 可能问题五&#xff1a; 问题分析&#xff1a; 答案格式&#xff1a; shared_ptr的模拟实现 部分1&#xff1a;引用计数的设计(分考点1) 代码实现&#xff1a; 部分2&#xff1a;作为类所必须的部分(分考点2) 代码实现&#xff1a; 部分3&#xff1a;拷贝构造函数…...

spring源码拓展点3之addBeanPostProcesser

概述 在refresh方法中的prepareBeanFactory方法中&#xff0c;有一个拓展点&#xff1a;addBeanPostProcessor。即通过注入Aware对象从而将容器中的某些值设置到某个bean中。 beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));aware接口调用 …...

【计网】理解TCP全连接队列与tcpdump抓包

希望是火&#xff0c;失望是烟&#xff0c; 生活就是一边点火&#xff0c;一边冒烟。 理解TCP全连接队列与tcpdump抓包 1 TCP 全连接队列1.1 重谈listen函数1.2 初步理解全连接队列1.3 深入理解全连接队列 2 tcpdump抓包 1 TCP 全连接队列 1.1 重谈listen函数 这里我们使用…...

react18中实现简易增删改查useReducer搭配useContext的高级用法

useReducer和useContext前面有单独介绍过&#xff0c;上手不难&#xff0c;现在我们把这两个api结合起来使用&#xff0c;该怎么用&#xff1f;还是结合之前的简易增删改查的demo&#xff0c;熟悉vue的应该可以看出&#xff0c;useReducer类似于vuex&#xff0c;useContext类似…...

排序算法 —— 冒泡排序

目录 1.冒泡排序的思想 2.冒泡排序的实现 3.冒泡排序的总结 1.冒泡排序的思想 冒泡排序的思想就是在待排序序列中依次比较相邻两个元素&#xff0c;将大的or小的元素往后挪&#xff0c;每一趟都能保证将至少一个元素挪动到正确的位置&#xff0c;然后在待排序序列中重复该过…...

QT--文本框 QLineEdit、qtextedit

在Qt中&#xff0c;文本框&#xff08;QLineEdit 或 QTextEdit&#xff09;和标签&#xff08;QLabel&#xff09;是两种不同的部件&#xff08;widget&#xff09;&#xff0c;它们的主要区别在于用途和功能&#xff1a; QLabel&#xff08;标签&#xff09; 用途&#xff1…...

Qt编写的modbus模拟器/支持网络和串口以及websocket/支持网络rtu

一、使用说明 1.1 设备模拟-Com 第一步&#xff0c;填写要模拟的设备地址&#xff0c;0表示自动处理&#xff0c;也就是收到什么地址就应答什么地址。第二步&#xff0c;填写对应的串口号和波特率。第三步&#xff0c;单击打开串口&#xff0c;成功后会变成关闭串口字样。单击…...

Standard_Matrix

文章目录 假设我们有一个样本矩阵X&#xff0c;每一列表示一个样本&#xff0c;现在我们要把样本转换成均值为0&#xff0c;方差为1的样本矩阵 X s t a n d a r d X − μ s \begin{equation} X_{standard}\frac{X-\mu}{s} \end{equation} Xstandard​sX−μ​​​python 测试…...

js 通过input,怎么把选择的txt文件转为base64格式

文章目录 基本概念与作用说明Base64编码File对象相互转换的意义 从File对象到Base64编码从Base64编码到File对象批量转换File对象为Base64编码批量转换Base64编码为File对象功能使用思路思路一&#xff1a;动态生成预览思路二&#xff1a;异步处理与用户反馈思路三&#xff1a;…...

华为HCIP-openEuler认证详解

华为HCIP认证&#xff08;Huawei Certified ICT Professional&#xff09;是华为提供的专业级ICT技术认证&#xff0c;它旨在验证技术人员在特定技术领域的专业知识和实践能力。对于华为欧拉&#xff08;openEuler&#xff09;方向的HCIP认证&#xff0c;即HCIP-openEuler&…...

YOLO11改进 | 注意力机制 | 添加双重注意力机制 DoubleAttention【附代码+小白必备】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 在本文中&#xff0c;给大家带来的教程是…...

sentinel原理源码分析系列(四)-ContextEntry

启动和初始化完成后&#xff0c;调用者调用受保护资源&#xff0c;触发sentinel的机制&#xff0c;首先构建或获取Context和获取Entry&#xff0c;然后进入插槽链&#xff0c;决定调用是否通过&#xff0c;怎样通过 上图展示构建Context和获取Entry的类互动图 获取或构建Conte…...

Tcp协议讲解与守护进程

TCP协议&#xff1a;面向链接&#xff0c;面向字节流&#xff0c;可靠通信 创建tcp_server 1.创建套接字 域&#xff1a;依旧选择AF_INET 连接方式&#xff1a; 选择SOCK_STREAM 可靠的 2.bind 3.监听装置 client要通信&#xff0c;要先建立连接&#xff0…...

学习threejs,THREE.LineDashedMaterial 虚线材质,基于gosper高斯帕曲线生成雪花动画

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.LineDashedMaterial虚…...

LeetCode 热题100之哈希

1.两数之和 思路分析1&#xff08;暴力法&#xff09; 双重循环枚举满足num[i] nums[j] target的索引&#xff0c;刚开始不知道如何返回一对索引。后来知道可以直接通过return {i,j}返回索引&#xff1b;注意&#xff1a;j应该从i1处开始&#xff0c;避免使用两次相同的元素…...

软工——模块设计(爱啦爱啦)

过程设计的工具 一、程序流程图 程序流程图又称为程序框图&#xff0c;它是历史最悠久、使用最广泛的描述过程设计的方法。 它的主要优点是对控制流程的描绘很直观&#xff0c;便于初学者掌握。 程序流程图历史悠久&#xff0c;至今仍在广泛使用着。 程序流程图的主要缺点&a…...

Xmind一款极简思维导图和头脑风暴软件,支持PC和移动端,Xmind 2024.10.01101版本如何升级到Pro版?简单操作,最新可用!

文章目录 Xmind下载安装Xmind免费升级到Pro Xmind 是一款全功能的思维导图和头脑风暴软件&#xff0c;不限制节点和文件数&#xff0c;创新无限&#xff0c;界面纯净简洁无广告&#xff0c;支持PC和移动端&#xff0c;思维导图和大纲视图自由切换&#xff0c;可本地化文档存储&…...

自动化工具:Ansible

目录 一、运维自动化工具有哪些 二、Ansible 概述 1、Ansible 概念 2、Ansible 特点 3、Ansible 工作流程 三、安装部署Ansible 1、环境部署 2、管理节点安装 Ansible 3、查看Ansible相关文件 4、配置主机清单 5、免密管理 ssh-keygen 5.1、测试连通性 5.2、简洁输…...

我是类(最终版)

文章目录 再看构造函数类型转换static静态成员友元内部类匿名对象对象拷贝时的编译器优化 再看构造函数 本标题的目的是解决如下问题&#xff1a;当实现MyQueue时&#xff0c;我们不需要写默认构造函数&#xff0c;因为编译器会调用Stack的默认构造&#xff0c;但是&#xff0…...

Unity Il2CppDumper原理与实战:解析元数据与二进制对齐

1. 这不是“破解工具”&#xff0c;而是Unity开发者该懂的二进制真相课 你刚在Unity Asset Store下载了一个功能惊艳的插件&#xff0c;却在打包iOS后发现部分逻辑失效&#xff1b;或者接手一个没有源码的旧项目&#xff0c;只有一堆 .dll 和 .so 文件&#xff0c;连主入口…...

Veo 2提示词效能跃迁实战(工业级Prompt链构建全图谱)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Veo 2提示词编写的核心范式演进 Veo 2作为新一代视频生成模型&#xff0c;其提示词&#xff08;prompt&#xff09;工程已从早期的“关键词堆叠”转向结构化、语义分层与意图对齐的复合范式。这一演进并非简…...

Python合并Excel文档

有若干个Excel文档&#xff0c;每个文档格式一致&#xff0c;及第一行为文件标题&#xff0c;第二行为表格表头&#xff08;表头不完全一致&#xff09;。现需要将他们合并。合并规则为&#xff1a;去掉每个文档的第一行&#xff0c;以第二行为表头&#xff0c;将每个文档的第三…...

Vulnhub-DC-1

1.信息收集 使用工具nmap扫描主机端口 这是Drupal是使用PHP语言编写的开源内容管理框架&#xff08;CMF&#xff09;&#xff0c;它由内容管理系统&#xff08;CMS&#xff09;和PHP开发框架&#xff08;Framework&#xff09;共同构成 Web指纹扫描 发现是&#xff1a;drupal…...

炉石传说自动对战助手:5分钟上手,彻底解放双手的终极指南

炉石传说自动对战助手&#xff1a;5分钟上手&#xff0c;彻底解放双手的终极指南 【免费下载链接】Hearthstone-Script Hearthstone script&#xff08;炉石传说脚本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 还在为每天重复的炉石…...

基于ESP32的AIS转WiFi转换器:实现NMEA 0183数据无线传输

1. 项目概述&#xff1a;从VHF-AIS接收器到iPad的无线桥梁作为一名经常在海上折腾电子设备的航海爱好者&#xff0c;我最近遇到了一个挺实际的需求&#xff1a;我的主力导航设备是iPad上的iSailor应用&#xff0c;它功能强大、界面友好&#xff0c;但有个“硬伤”——它需要通过…...

如何进行TVA仿真引擎的“光照地狱”训练?

重磅预告&#xff1a;本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容&#xff0c;该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著&#xff0c;特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...

荣耀出征官方网站下载正版手游 翅膀养成细节玩法全方位讲解

玩荣耀出征的玩家都清楚&#xff0c;翅膀不仅是角色的颜值象征&#xff0c;更是提升整体战力的核心途径。很多新手玩家只顾着升级、刷装备&#xff0c;完全忽略翅膀养成&#xff0c;导致等级很高但战力始终上不去。还有不少玩家胡乱合成、盲目进阶&#xff0c;浪费了大量稀有翅…...

YOLOv8晶圆体缺识别检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+环境配置)

摘要 晶圆制造过程中的缺陷检测是保证芯片良率的关键环节。本文基于YOLOv8目标检测算法&#xff0c;构建了一套针对晶圆表面9类典型缺陷的自动检测系统。所识别的缺陷类型包括&#xff1a;Center、Donut、Edge-Loc、Edge-Ring、Loc、Near-full、None、Random、Scratch。模型在…...

DeepSeek重复代码识别失效了?5个被90%团队忽略的AST解析盲区及修复清单

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;DeepSeek代码重复检测失效的真相与影响 DeepSeek-R1 模型在代码理解任务中表现出色&#xff0c;但其内置的代码重复检测机制在特定场景下存在系统性失效。根本原因在于模型对语义等价但语法结构差异显著的代…...