【看球和学Go】错误和异常、CGO、fallthrough

news2025/8/8 4:34:25

这篇文章将详解「Go必知必会」的知识点:

  1. 错误和异常的对比、发生panic后如何执行代码?会执行到defer代码段吗?
  2. CGO是什么?CGO的作用是什么?
  3. switch中的fallthrough

错误&异常

错误指的是可能出现问题的地方出现了问题,比如打开一个文件时失败,这种情况在人们的意料之中

异常指的是不应该出现问题的地方出现了问题,比如引用了空指针,这种情况在人们的意料之外。

可见,错误是业务过程的一部分,而异常不是 。

处理错误:error

Golang中引入error接口类型作为错误处理的标准模式,如果函数要返回错误,则返回值类型列表中肯定包含error。error处理过程类似于C语言中的错误码,可逐层返回,直到被处理。

处理异常:panic&recover

Golang中引入两个内置函数panic和recover来触发和终止异常处理流程,同时引入关键字defer来延迟执行defer后面的函数。

panic&defer

当数组越界、访问非法空间或者我们直接调用panic时,panic会停掉当前正在执行的程序,包括所有协程,比起exit直接退出,panic的退出更有秩序,他会他会先处理完当前goroutine已经defer挂上去的任务,执行完毕后再退出整个程序。

而defer的存在,让我们有更多的选择,比如在defer中通过recover截取panic,从而达到try…catch的效果

panic还可以接收一个参数,通常是字符串类型错误信息,执行到panic时,他会打印这个字符串和触发他的调用栈。

当然,我们在写代码时要注意,不是所有的异常都能被捕获到的,像fatal error 和runtime.throw 都是不能被recover的

defer执行顺序

你可以在一个函数中执行多条defer语句,它们的执行顺序与声明顺序相反:最早声明的defer最后执行。

总结

当程序运行时,如果遇到引用空指针、下标越界或显式调用panic函数等情况,则先触发panic函数的执行,然后调用延迟函数。调用者继续传递panic,因此该过程一直在调用栈中重复发生:函数停止执行,调用延迟执行函数等。如果一路在延迟函数中没有recover函数的调用,则会到达该协程的起点,该协程结束,然后终止其他所有协程,包括主协程(类似于C语言中的主线程,该协程ID为1)。

对比Java、C++

错误和异常从Golang机制上讲,就是error和panic的区别。很多其他语言也一样,比如C++/Java,没有error但有errno,没有panic但有throw。

错误异常互相转换

Golang错误和异常是可以互相转换的:

  1. 错误转异常,比如程序逻辑上尝试请求某个URL,最多尝试三次,尝试三次的过程中请求失败是错误,尝试完第三次还不成功的话,失败就被提升为异常了。
  2. 异常转错误,比如panic触发的异常被recover恢复后,将返回值中error类型的变量进行赋值,以便上层函数继续走错误处理流程

CGO

CGO是调用C代码模块,静态库和动态库。

CGO是C语言和Go语言之间的桥梁,原则上无法直接支持C++的类。CGO不支持C++语法的根本原因是C++至今为止还没有一个二进制接口规范(ABI)。

CGO只支持C语言中值类型的数据类型,所以我们是无法直接使用C++的引用参数等特性的。

fallthrough

在一个 switch 块内,每个 case 无需声明 break 来终止,如果想顺序执行使用fallthrough

如果我们想强制执行满足条件case的后一个case,也可以通过设置fallthrough的方式:

代码示例

package main

import "fmt"

func main() {
    switch {
    case false:
            fmt.Println("false1")
            fallthrough
    case true:
            fmt.Println("true1")
            fallthrough
    case false:
            fmt.Println("false2")
            fallthrough
    case true:
            fmt.Println("true2")
    case false:
            fmt.Println("false3")
            fallthrough
    default:
            fmt.Println("default case")
    }
}

思考一下上面代码的执行结果是什么?

执行结果

注意:在switch块内,都建议包含一个 default 语句并且放在最后,即使它什么代码也没有。

延伸知识点:在select块中,default能避免死锁问题。

总结

我们来总结一下:

  1. 在一个 switch 块内,每个 case 无需声明 break 来终止,如果想顺序执行使用fallthrough;如果我们想强制执行满足条件case的后一个case,也可以通过设置fallthrough的方式。
  2. CGO是调用C代码模块,静态库和动态库。CGO只支持C语言中值类型的数据类型,所以我们是无法直接使用C++的引用参数等特性的。
  3. 当程序运行时,如果遇到引用空指针、下标越界或显式调用panic函数等情况,则先触发panic函数的执行,然后调用延迟函数。调用者继续传递panic,因此该过程一直在调用栈中重复发生:函数停止执行,调用延迟执行函数等。如果一路在延迟函数中没有recover函数的调用,则会到达该协程的起点,该协程结束,然后终止其他所有协程,包括主协程(类似于C语言中的主线程,该协程ID为1)。

一起学习

欢迎在CSDN私信我,如果没能及时回复,欢迎扫下方公众号关注我:

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

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

相关文章

云原生系列 六【轻松入门容器基础操作】

✅作者简介: CSDN内容合伙人,全栈领域新星创作者,阿里云专家博主,华为云享专家博主,掘金后端评审团成员 💕前言: 最近云原生领域热火朝天,那么云原生是什么?何为云原生&a…

深度学习第一次作业 - 波士顿房价预测

文章目录划分训练集和测试集建立线性回归模型特征选择重建模型尝试使用GradientBoostingimport pandas as pd import numpy as np import seaborn as sns from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklea…

第一个SpringBoot项目的创建

目录 一、SpringBoot是什么? 初识springboot springboot的优点 二、SpringBoot项目的创建与简单运行 🍑使用idea创建springboot项目 🍑 Spring Boot 项目目录介绍 🍑springboot项目的简单运行与使用 一、SpringBoot是什么&a…

emq证书过期问题

近期在进行远程漏洞扫描后发现,有存在服务器证书过期的情况,可以通过以下步骤进行问题的处理: 1、先根据对应出现漏洞的端口进行检查,看端口对应的服务是哪个服务: netstat -tunlp|grep 端口号 2、通过命令&#xf…

40 - 前置操作符和后置操作符

---- 整理自狄泰软件唐佐林老师课程 问题 下面代码的区别?why? 1.1 编程实验 汇编中的处理是一样的,所以不可能从编译后的二进制程序还原 i 还是 i 1.2 事实 现代编译器产品会对代码进行优化优化使得最终的二进制程序更加高效优化后的二…

[附源码]java毕业设计渔具店管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【Linux】系统编程之网络编程(socket)

目录一、Socket编程1、TCP/UDP(1)TCP/UDP区别(2)TCP/UDP服务端和客户端的通信流程2、IP地址和端口号(1)IP地址(2)端口号二、字节序1、字节系相关概念2、有关字节序转换的函数&#x…

小小王总,如何变成任正非、化腾、强东这样的巨人!

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,非公众号转载保留此声明。王总特别迷信外面的企业培训。当遇到问题时,他喜欢去取经。这个经不像唐僧取经一样,需要历经九九八十一难…

ImmunoChemistry艾美捷通用阻断ELISA阻断缓冲液说明书

ImmunoChemistry艾美捷通用阻断ELISA阻断缓冲液包含适用于大多数抗体捕获ELISA格式和肽或蛋白质抗原下调ELISA格式的哺乳动物蛋白质阻断剂。这种封闭缓冲液为干燥的抗原或抗体外壳蛋白提供了长期稳定的环境,并使测定过程中的非特异性结合相互作用最小化。 General B…

中石油测井-技术研发岗回顾

前提: 时间:2022年11月25日 结果:暂未可知 阶段:面试结束 等结果 整个过程中,注意查看官网 中石油招聘 投递之前关注一下基本要求(学历-专业) 招聘人数:应聘人数 (通过能…

【富文本编辑器】Ueditor的demo——创建、修改——代码使用

文章目录富文本编辑器简述:使用:1.下载的demo:2.项目创建:3.修改代码:4.使用富文本编辑器:示例:富文本编辑器 Ueditor的资源官网:http://fex.baidu.com/ueditor/ 资源下载官网&…

【Linux】进程优先级(PRI,NI)和进程切换

1、进程优先级 无论是外设还是CPU,所能提供给操作系统的资源很少,而操作系统中的进程又非常多,安排谁先使用资源,就需要进程优先级的存在。   查看进程优先级 ps -al 查看当前运行进程的优先级信息。 ps -al | grep test 配合…

卫龙食品冲刺港股:上半年经调整利润超4亿 高瓴与红杉是股东

雷帝网 雷建平 11月24日卫龙食品日前更新招股书,准备在香港上市。这是卫龙食品通过聆讯后第二次更新招股书。卫龙食品的前身可追溯到20多年前。当年,卫龙食品创办人刘卫平下了火车,找到一个简陋的小旅馆休息,天亮后,就…

DirectX12 - Swap Chain(交换链)

这里是SunshineBooming,GPU公司一枚小小的Driver工程师,主要工作是写DirectX12 Driver,我会持续更新这个DX12 Spec系列,可能比较冷门,但是都是干货和工作中的心得体会,有任何GPU相关的问题都可以在评论区互…

宠物经济:千亿级的孤独生意,如何用智能化玩出新花样?

今年双十一,由铲屎官们主导的宠物经济成功实现逆增长,在众多行业中脱颖而出,成为消费疲软环境下的一匹强势黑马。 天猫、京东数据显示:双十一期间,天猫平台宠物烘焙粮销量同比增长超 700%,京东平台宠物高端…

js逆向tips-某思录登录

0. 写在最前 现在很多时候我们再网页上进行操作时都是用http协议进行一个交流,前端后也是如此,现在的开发模式大部分都是前后端分离的一个交互模式,那就意味着前端发送请求时也是和我们点击按钮一样去向后端发送一个请求,那这种请…

Pr 时间重映射卡点

哈喽,各位小伙伴!今天我们来学习一下如何通过用Pr时间重映射做出卡点的效果~ 卡点音乐 一首适合卡点(群青为例)的音乐可以帮助我们更好的掌握视频的节奏,卡点可以采用手动卡点,方法可以通过在峰值最高处标…

3.66 OrCAD中不同的工程文件,怎么输出所需要工程文件的网表?OrCAD中怎么给元器件自定义属性?

笔者电子信息专业硕士毕业,获得过多次电子设计大赛、大学生智能车、数学建模国奖,现就职于南京某半导体芯片公司,从事硬件研发,电路设计研究。对于学电子的小伙伴,深知入门的不易,特开次博客交流分享经验&a…

vue如何通过VNode渲染节点

vue如何通过VNode渲染节点vue的源码包含三大核心实现一个Mini-Vue渲染系统的实现vue2和vue3写法上的区别vue的源码包含三大核心 Compiler模块:编译模板系统 Runtime模块:也可以称之为Renderer模块,真正的渲染的模块 Reactivity模块&#x…

合成孔径雷达地面运动目标检测技术研究——基于概率图(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…