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

Golang—— error 和 panic

本文详细介绍Golang的两种错误处理机制:error 和 panic。

在这里插入图片描述

文章目录

    • Golang 的错误处理机制概述
    • `error`
      • 特点
      • 代码示例
        • 基本用法
        • 创建 `error`
    • `panic`
      • 特点
      • 运行时错误示例
      • `defer` 和 `recover` 的结合使用
      • 代码示例
        • 基本用法
        • 创建 `panic`
      • `panic` 的执行机制
    • `error` 和 `panic` 的对比
    • 生产环境的建议
    • 生产环境中使用 `panic` 的场景
      • 启动阶段异常强制终止。
        • 场景
        • 示例
        • 不需要捕获
      • 异步 Goroutine 中的异常防护
        • 场景
        • 示例
        • 需要捕获

Golang 的错误处理机制概述

Golang 提供两种主要的错误处理机制:

  • error:处理程序员可预知、意料之中的错误,例如文件打开失败、输入不合法等。
  • panic:处理程序员无法预知的严重异常,例如数组越界、空指针引用等。这类错误通常是不可恢复的,可能导致程序崩溃。

error

特点

  • 用于表示可预见的、常规的错误。
  • 开发者需要主动处理 error。
  • 通过返回值传递错误。

代码示例

基本用法
func main() {content, err := ioutil.ReadFile("filepath")if err != nil {// 错误处理// 记录错误信息fmt.Println("Error:", err)} else {fmt.Println(string(content))}
}
  • 如果 err == nil,表示没有错误;否则需要对错误进行处理。
创建 error

Go 提供两种方式创建 error

  1. 使用 errors.New
    import "errors"
    fmt.Println(errors.New("错误"))
    
  2. 使用 fmt.Errorf
    import "fmt"
    fmt.Println(fmt.Errorf("错误"))
    

panic

特点

  • 表示不可预期的错误:程序员无法预测的运行时错误,例如空指针、数组越界。
  • 会导致程序崩溃:如果不加处理,panic 会中止程序运行。
  • 结合 deferrecover 使用:提供有限的恢复能力。

运行时错误示例

func main() {n := 0res := 1 / n // 引发 panic:除以零fmt.Println(res)
}

deferrecover 的结合使用

recover 是 Go 内置函数,用于捕获 panic,实现部分恢复程序控制权。

代码示例

基本用法
func handlePanic() {if err := recover(); err != nil {fmt.Println("Recovered from panic:", err)}
}func main() {defer handlePanic() // 在 panic 前注册 defern := 0res := 1 / n        // 引发 panicfmt.Println(res)    // 这行不会执行
}
  • defer 的执行顺序是先进后出,注册顺序很重要。
  • panic 被捕获时,recover 会返回 panic 的错误信息。

创建 panic

通过内置函数 panic,直接触发一个运行时错误,终止程序执行。

package mainfunc main() {panic("this is a panic")
}
  • 特点:触发后程序立即进入 panic 状态,中止执行当前函数,并调用已注册的 defer 函数。

panic 的执行机制

  • panic 发生:

    1. 程序中止运行。
    2. 当前 goroutine 中的所有 defer 会按逆序执行。
    3. 如果没有 recover,程序将崩溃并打印 panic 信息。
  • recover 的限制

    • 必须在 defer 中调用。
    • 只能捕获当前 goroutine 的 panic
    • defer要在panic之前先注册(defer必须在panic前面),否则不能捕获异常。defer 会确保即使发生 panic,仍然可以执行资源清理逻辑。

errorpanic 的对比

特性errorpanic
定义可预期的错误不可预期的严重异常
处理方式通过返回值传递,由调用方检查和处理通过 deferrecover 捕获
程序状态不中断程序中断程序
使用场景文件操作失败、网络超时等正常错误数组越界、空指针等致命错误
恢复能力错误处理后可恢复如果没有 recover 则无法恢复

总结:

  • error 是 Go 中主要的错误处理方式,适合处理常规错误。
  • panic 应用于不可恢复的错误,但应谨慎使用,避免影响程序健壮性。

生产环境的建议

实际开发中,使用Error会多,一些逻辑的判断,错误都会使用error,但是很少用到Panic。

以下是关于 生产环境中使用 panic 的场景是否需要捕获 panic


生产环境中使用 panic 的场景

在生产环境中,panic 的使用场景非常有限,通常只用于程序中无法恢复的严重错误。以下是一些实际使用 panic 的典型场景:

一般来说,常用的Web框架/任务调度系统都会在框架的出入口封装panic及其捕获逻辑(防御性编程和不可恢复的逻辑错误),程序的顶层入口函数中捕获所有未处理的 panic,用于记录日志、释放资源或优雅退出程序。

防御性编程:库函数或 API 接收到非法输入导致程序状态不安全时,可以使用 panic 作为防御手段,明确提示调用方。
不可恢复的逻辑错误:数据结构或状态出现严重问题,如数组越界、递归深度超限等,这种错误通常不可恢复。

  • 在 Web 服务中,一个请求引发的 panic 不应影响其他请求。
  • 任务调度系统中,一个任务的 panic 不应导致整个系统宕机。

上面是web框架在做的一些panic场景的封装,下面是两个在日常开发中,需要额外注意的情况:

启动阶段异常强制终止。

启动阶段是指 运行程序时 的初始化阶段,也就是程序开始执行 main.go 文件中的代码时。

场景
  • 启动阶段依赖的关键资源(如配置文件、数据库连接)缺失或初始化失败。
  • 如果这些问题无法解决,程序不应继续运行。
示例
package mainimport ("fmt""os"
)func loadConfig(filePath string) {if _, err := os.Stat(filePath); os.IsNotExist(err) {panic(fmt.Sprintf("Critical error: Config file %s is missing", filePath))}fmt.Println("Configuration loaded successfully.")
}func main() {loadConfig("missing_config.yaml") // 模拟配置文件缺失
}
不需要捕获

不需要。
此类问题属于致命错误,无法恢复,直接让程序崩溃是合理的选择,开发者需要修复问题。


异步 Goroutine 中的异常防护

场景
  • 同步 Goroutine 的生命周期和主 Goroutine 紧密相连。大多数 Web 框架、任务调度系统在框架出入口对 panic 进行统一封装,并在必要时捕获和处理。
  • 异步 Goroutine 的生命周期独立于主 Goroutine,通常运行在并发的上下文中,主 Goroutine 无法直接感知异步 Goroutine 的异常。所以更需要使用异常防护,如果异步 Goroutine 中发生 panic 且未捕获,会导致整个程序直接崩溃,并且难以排查错误原因。
示例
package mainimport ("fmt""time"
)func safeGo(task func()) {go func() {defer func() {if r := recover(); r != nil {fmt.Println("Recovered from panic in goroutine:", r)// 此处可以添加错误日志记录逻辑或其他恢复措施}}()task()}()
}func main() {safeGo(func() {panic("Task failed!") // 模拟任务失败})fmt.Println("Program continues running...")time.Sleep(2 * time.Second) // 等待 Goroutine 执行完成
}
需要捕获

原因

  1. 防止程序崩溃
    • Goroutine 中的异常如果未被捕获,会导致程序崩溃,特别是在关键服务中,这是不可接受的。
  2. 错误追踪
    • 捕获异常后可以记录日志,帮助开发人员分析错误发生的原因。
  3. 业务连续性
    • 即使某个任务失败,通过异常捕获可以让程序继续运行其他任务,保证服务稳定性。

注意事项

  • 明确恢复策略:捕获异常后,需要有明确的恢复策略,比如是否需要重试任务,或如何通知其他服务。
  • 避免滥用 recover:捕获异常是为了保护程序稳定运行,但也要避免滥用 recover,导致隐藏问题无法被及时发现和修复。
  • 日志记录:捕获异常后需要将详细的错误信息记录到日志中,方便后续排查。日志等级:Debug < Info < Warn < Error < Panic

相关文章:

Golang—— error 和 panic

本文详细介绍Golang的两种错误处理机制&#xff1a;error 和 panic。 文章目录 Golang 的错误处理机制概述error特点代码示例基本用法创建 error panic特点运行时错误示例defer 和 recover 的结合使用代码示例基本用法创建 panic panic 的执行机制 error 和 panic 的对比生产环…...

xcrun: error: invalid active developer path 解决

在拉取 github 代码时&#xff0c;提示如下报错&#xff1a; xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun 原因是&#xff1a;这是由于 Xcode command line t…...

Jmeter配置服务代理器 Proxy(二)

1.创建脚本记录器 2.配置&#xff1a;Jmeter代理、端口、记录目标等 3.配置谷歌浏览器代理 浏览器配置代理的详细教程可参考&#xff1a;使用whistle代理-CSDN博客 4.启动Jmeter记录器 点击ok后弹出这个界面&#xff0c;生成了证书&#xff1a; 5.给浏览器安装Jmeter代理的证书…...

小黑工具人日常积累中:sqlserver中切割字符串,取首个子串

SELECTSUBSTRING(表名字, 1, CHARINDEX(分隔符, 字段名) - 1) AS FirstPart FROM表名字 WHERECHARINDEX(分隔符, 字段名) > 0继续尝试: 提取第二个子串 窗口函数...

港科夜闻 | 香港科大与微软亚洲研究院签署战略合作备忘录,推动医学健康教育及科研协作...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与微软亚洲研究院签署战略合作备忘录&#xff0c;推动医学健康教育及科研协作。根据备忘录&#xff0c;双方将结合各自于科研领域的优势&#xff0c;携手推动医学健康领域的交流与合作。合作方向将涵盖人才培训、…...

掌握Golang strings包:高效字符串处理指南

掌握Golang strings包&#xff1a;高效字符串处理指南 引言为什么要学习和掌握strings包本教程的目标 基本用法strings包概述导入strings包常用函数列表及简要介绍 字符串创建与基本操作创建字符串字符串连接&#xff1a;Join重复字符串&#xff1a;Repeat修改字符串&#xff1…...

关于husky8.0 与 4.0的配置

husky的场景使用很多&#xff0c;一般大多场景是在配置git commit 命令拦截hook, 校验 commit-msg 格式规范。以下环境默认&#xff1a;git > 2.27.0, node >14 1、安装huskey8.0.1 npm install --save-dev husky8.0.1 2、初始化配置文件 在package.json scripts 属性…...

【RK3588 Linux 5.x 内核编程】-Linux内核数据结构详解(双向链表、基数树、位数组)

Linux内核数据结构详解(双向链表、基数树、位数组) 文章目录 Linux内核数据结构详解(双向链表、基数树、位数组)1、双向链表2、基数树3、位数组3.1 Linux内核中的位数组和位操作3.2 位数组声明3.3 特定于架构的位操作3.4 常见的位操作Linux内核提供了不同的数据结构实现,如…...

3.Qt Quick-QML地图引擎之v4.3版本(新增动态轨迹线/海图/天地图街道/天地图卫星)

在上个版本Qt Quick-QML地图引擎之v4版本(新增多模型切换/3D模型欧拉角模拟)_qt加载3d地图-CSDN博客更新了3D模拟功能&#xff0c;在4.3版本增加动态轨迹线、三个地图(海图/天地图街道/天地图卫星)。 4.3版本已经支持qt6 cmake版本&#xff0c;而4.3版本以下支持qt5版本&#x…...

使用WebdriverIO和Appium测试App

1.新建项目 打开Webstorm新建项目 打开终端输入命令 npm init -y npm install wdio/cli allure-commandline --save-dev npx wdio config 然后在终端依次选择如下&#xff1a; 然后在终端输入命令&#xff1a; npm install wdio/local-runnerlatest wdio/mocha-frameworkla…...

前端组件开发:组件开发 / 定义配置 / 配置驱动开发 / 爬虫配置 / 组件V2.0 / form表单 / table表单

一、最早的灵感 最早的灵感来自sprider / 网络爬虫 / 爬虫配置&#xff0c;在爬虫爬取网站文章时候&#xff0c;会输入给爬虫一个配置文件&#xff0c;里边的内容是一个json对象。里边包含了所有想要抓取的页面的信息。爬虫通过这个配置就可以抓取目标网站的数据。其实本文要引…...

工具推荐:PDFgear——免费且强大的PDF编辑工具 v2.1.12

PDFgear——免费且强大的PDF编辑工具 v2.1.12 软件简介 PDFgear 是一款 完全免费的 PDF 软件&#xff0c;支持 阅读、编辑、转换、合并 以及 跨设备签署 PDF 文件&#xff0c;无需注册即可使用。它提供了丰富的 PDF 处理功能&#xff0c;极大提升了 PDF 文件管理的便捷性和效…...

【Unity3D】【已解决】TextMeshPro无法显示中文的解决方法

TextMeshPro无法显示中文的解决方法 现象解决方法Assets 目录中新建一个字体文件夹在C:\Windows\Fonts 中随便找一个中文字体的字体文件把字体文件拖到第一步创建的文件夹中右键导入的字体&#xff0c;Create---TextMeshPro---Font Asset&#xff0c;创建字体文件资源把 SDF文件…...

【Unity】使用UniRx来快速完成Unity中的信号层开发工作。

访问官方 网址&#xff1a;https://github.com/neuecc/UniRx/ UniRx&#xff08;Unity反应式扩展&#xff09;是.NET 反应式扩展的重新实现。官方 Rx 实现很棒&#xff0c;但在 Unity 上不起作用&#xff0c;并且存在 iOS IL2CPP 兼容性问题。此库修复了这些问题&#xff0c;并…...

FPGA工程师成长四阶段

朋友&#xff0c;你有入行三年、五年、十年的职业规划吗&#xff1f;你知道你所做的岗位未来该如何成长吗&#xff1f; FPGA行业的发展近几年是蓬勃发展&#xff0c;有越来越多的人才想要或已经踏进了FPGA行业的大门。很多同学在入行FPGA之前&#xff0c;都会抱着满腹对职业发…...

配置Kubernetes从节点与集群Calico网络

在上一篇博客中&#xff0c;我们成功安装并初始化了Kubernetes的主节点&#xff0c;并且看到了集群初始化成功的标志信息。接下来&#xff0c;我们将继续安装从节点&#xff08;worker nodes&#xff09;&#xff0c;以构建一个完整的Kubernetes集群。 步骤回顾 在上一步中&a…...

【SH】Xiaomi9刷Windows10系统研发记录 、手机刷Windows系统教程、小米9重装win10系统

文章目录 参考资料云盘资料软硬件环境手机解锁刷机驱动绑定账号和设备解锁手机 Mindows工具箱安装工具箱和修复下载下载安卓和woa资源包第三方Recovery 一键安装Windows准备工作创建分区安装系统 效果展示Windows和Android一键互换Win切换安卓安卓切换Win 删除分区 参考资料 解…...

【Qt】01-了解QT

踏入QT的殿堂之路 前言一、创建工程文件1.1 步骤介绍1.2 编译介绍方法1、方法2、编译成功 二、了解框架2.1 main.cpp2.2 .Pro文件2.2.1 注释需要打井号。2.2.2 F1带你进入帮助模式2.2.3 build文件 2.3 构造函数 三、编写工程3.1 main代码3.2 结果展示 四、指定父对象4.1 main代…...

STC的51单片机LED点灯基于KEIL

前言&#xff1a; 该文源于回答一个朋友的问题&#xff0c;代码为该朋友上传&#xff0c;略作修改&#xff0c;在此说明问题以及解决问题的思路&#xff0c;以减少新手错误。 电路图&#xff1a; 该位朋友未上传电路图&#xff0c;说明如下&#xff1a; stc8g1k08a-sop8控制…...

AV1视频编解码简介、码流结构(OBU)

我的音视频/流媒体开源项目(github) 目录 一、AV1编码技术 二、AV1码流结构(OBU) 三、IVF文件格式 四、ffmpeg支持AV1 五、关于常见格式对AV1的封装 一、AV1编码技术 AV1是由开放媒体联盟(AOM&#xff0c;Alliance for Open Media)在2018年发布的&#xff0c;AV1的前身…...

Service Work离线体验与性能优化

Service Work离线体验与性能优化 引言 先放个意外事件&#xff0c;万事开头难&#x1f923;&#x1f923;&#x1f923; 原计划是分享离线应用与数据资源缓存的应用实践&#xff0c;结果发现这一技术已被web标准废弃 曾经做过一个PC应用&#xff0c;业务需求要求应用具备容灾…...

linux之进程信号(初识信号,信号的产生)

目录 引入一、初识信号(信号预备知识)1.生活中的信号2.Linux中的信号3.信号进程得出的初步结论 二、信号的产生1.通过终端输入产生信号拓展: 硬件中断2.调用系统函数向进程发信号3.硬件异常产生信号4.软件条件产生信号拓展: 核心转储技术总结一下&#xff1a; 引入 一、初识信…...

为深度学习创建PyTorch张量 - 最佳选项

为深度学习创建PyTorch张量 - 最佳选项 正如我们所看到的&#xff0c;PyTorch张量是torch.Tensor​ PyTorch类的实例。张量的抽象概念与PyTorch张量之间的区别在于&#xff0c;PyTorch张量为我们提供了一个可以在代码中操作的具体实现。 在上一篇文章中&#xff0c;我们看到了…...

MySQL 与 Redis 数据一致性 2

1. 强一致还是最终一致?2. 先写 MySQL 还是先写Redis?case 1 3. 缓存(Redis)更新还是清除?更新策略更新策略会有数据不一致问题?数据不一致的概率与影响如果使用监听binlog更新数据还会出现数据不一致问题?binlog的消费问题 使用消息队列行不行?其他方案总结: 数据不一致…...

Git | git reset命令详解

关注&#xff1a;CodingTechWork 引言 Git 是一款非常流行的分布式版本控制工具&#xff0c;它帮助开发者有效地管理代码历史&#xff0c;支持多种功能来帮助团队协作、追踪修改和维护代码质量。git reset是 Git 中最强大、最复杂的命令之一&#xff0c;它的主要作用是重置当前…...

Linux高并发服务器开发 第十四天(dup/duo2/fcntl 进程 pcb进程控制块 环境变量)

目录 1.dup 和 dup2 1.1dup 1.2dup2 2.fcntl 3.进程 3.1进程和程序 3.2并发 3.3cpu 3.5pcb进程控制块 3.6进程状态 4.环境变量 1.dup 和 dup2 1.1dup - 将 文件描述符 &#xff0c;复制产生“新文件描述符” 并返回。新、旧文件描述符&#xff0c;指向同一文件。 …...

[MySQL | 二、基本数据类型]

基本数据类型 一、数值类型举例表结构1. 整数类型zerofill属性 与 int(n) 中 n 的关系 2.bit类型3. 小数类型float类型decimal类型 二、字符串类型1. char2. varchar如何选择定长或变长字符串&#xff1f; 3. 日期时间类型(date datetime timestamp)4. enum枚举类型5. set多选类…...

第G1周:生成对抗网络(GAN)入门

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** 本人往期文章可查阅&#xff1a; 深度学习总结 基础任务 1.了解什么是生成对抗网络2.生成对抗网络结构是怎么样的3.学习本文代码&am…...

ROS2 准备工作(虚拟机安装,Ubuntu安装,ROS2系统安装)

准备工作 虚拟机安装 大家可以自行去安装VMware链接&#xff1a;https://pan.baidu.com/s/1KcN1I9FN--Sp1bUsjKqWVA?pwd6666 提取码&#xff1a;6666(提供者&#xff1a;零基础编程入门教程) 教程&#xff1a;【【2025最新版】VMware虚拟机安装教程&#xff0c;手把手教你免…...

FreeType 介绍及 C# 示例

FreeType 是一个开源的字体渲染引擎&#xff0c;用于将字体文件&#xff08;如 TrueType、OpenType、Type 1 等&#xff09;转换为位图或矢量图形。它广泛应用于操作系统、图形库、游戏引擎等领域&#xff0c;支持高质量的字体渲染和复杂的文本布局。 FreeType 的核心功能 字体…...

BertTokenizerFast 和 BertTokenizer 的区别

BertTokenizerFast 和 BertTokenizer 都是用于对文本进行标记化的工具&#xff0c;主要用于处理和输入文本数据以供 BERT 模型使用。它们都属于 HuggingFace 的 transformers 库。 主要区别 底层实现&#xff1a; BertTokenizer: 这是一个使用纯 Python 实现的标记器&#xff…...

OpenGL中Shader LOD失效

1&#xff09;OpenGL中Shader LOD失效 2&#xff09;DoTween的GC优化 3&#xff09;开发微信小程序游戏有没有类似Debug真机图形的方法 4&#xff09;射线和Mesh三角面碰撞检测的算法 这是第418篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了U…...

[操作系统] 深入理解约翰·冯·诺伊曼体系

约翰冯诺依曼&#xff08;John von Neumann&#xff0c;1903年12月28日—1957年2月8日&#xff09;&#xff0c;原名诺伊曼亚诺什拉约什&#xff08;Neumann Jnos Lajos&#xff09;&#xff0c;出生于匈牙利的美国籍犹太人数学家&#xff0c;20世纪最重要的数学家之一&#xf…...

计算机网络(五)运输层

5.1、运输层概述 概念 进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时…...

网络分析仪测试S参数

S参数的测试 一&#xff1a;S参数的定义 S参数&#xff08;Scattering Parameters&#xff0c;散射参数&#xff09;是一个表征器件在射频信号激励下的电气行为的工具&#xff0c;它以输入信号、输出信号为元素的矩阵来表现DUT的“传输”和“散射”效应&#xff0c;输入、输出…...

什么是数据仓库?

什么是数据仓库&#xff1f; 数据仓库&#xff08;Data Warehouse&#xff0c;简称DW&#xff09;是一种面向分析和决策的数据存储系统&#xff0c;它将企业中分散的、异构的数据按照一定的主题和模型进行集成和存储&#xff0c;为数据分析、报表生成以及商业智能&#xff08;…...

.NET8.0多线程编码结合异步编码示例

1、创建一个.NET8.0控制台项目来演示多线程的应用 2、快速创建一个线程 3、多次运行程序&#xff0c;可以得到输出结果 这就是多线程的特点 - 当多个线程并行执行时&#xff0c;它们的具体执行顺序是不确定的&#xff0c;除非我们使用同步机制&#xff08;如 lock、信号量等&am…...

使用 Charles 调试 Flutter 应用中的 Dio 网络请求

为了成功使用 Charles 抓取并调试 Flutter 应用程序通过 Dio 发起的网络请求&#xff0c;需遵循特定配置步骤来确保应用程序能够识别 Charles 的 SSL 证书&#xff0c;并正确设置代理服务器。 配置 Charles 以支持 HTTPS 请求捕获 Charles 默认会拦截 HTTP 流量&#xff1b;…...

老centos7 升级docker.io为docker-ce 脚本

旧的centos7 之前安装的是docker.io 由于一些原因,像docker compose 等版本变化,以及docker.io源受限等,我们要更新到docker-ce 并使用国内阿里云的源怎么处理?下面直接上脚本,upgrade-docker.sh #!/bin/bashset -e# 创建临时目录 TEMP_DIR"./tmp" mkdir -p "…...

Go Ebiten小游戏开发:贪吃蛇

贪吃蛇是一款经典的小游戏&#xff0c;玩法简单却充满乐趣。本文将介绍如何使用 Go 语言和 Ebiten 游戏引擎开发一个简单的贪吃蛇游戏。通过这个项目&#xff0c;你可以学习到游戏开发的基本流程、Ebiten 的使用方法以及如何用 Go 实现游戏逻辑。 项目简介 贪吃蛇的核心玩法是…...

c语言----------内存管理

内存管理 目录 一。作用域1.1 局部变量1.2 静态(static)局部变量1.3 全局变量1.4 静态(static)全局变量1.5 extern全局变量声明1.6 全局函数和静态函数1.7 总结 二。内存布局2.1 内存分区2.2 存储类型总结2.3内存操作函数1) memset()2) memcpy()3) memmove()4) memcmp() 2.4 堆…...

在一个sql select中作多个sum并分组

有表如下&#xff1b; 单独的对某一个列作sum并分组&#xff0c;结果如下&#xff1b; 对于表的第7、8行&#xff0c;num1都有值&#xff0c;num2都是null&#xff0c;对num2列作sum、按id分组&#xff0c;结果在id为4的行会显示一个null&#xff1b; 同时对2个列作sum&#x…...

如何修复Android上未安装的应用程序

在Android设备上安装应用程序通常是一个简单的过程。然而&#xff0c;“ Android上未安装应用程序”是一种常见的智能手机错误消息&#xff0c;由于一个或多个原因而经常遇到。发现由于即将出现故障而无法充分利用手机&#xff0c;这当然会非常令人沮丧&#xff0c;但幸运的是&…...

#CSS混合模式:解决渐变背景下的文字可见性问题

在现代网页设计中&#xff0c;渐变背景的使用越来越普遍。然而&#xff0c;当我们在渐变背景上放置文字时&#xff0c;常常会遇到一个问题&#xff1a;文字在某些背景颜色下可能变得难以阅读。今天&#xff0c;我们将探讨一个优雅的解决方案&#xff1a;使用CSS混合模式。 问题…...

微信小程序原生与 H5 交互方式

在微信小程序中&#xff0c;原生与 H5 页面&#xff08;即 WebView 页面&#xff09;之间的交互通常有以下几种方式&#xff1a; 1. 使用 postMessage 进行通信 微信小程序的 WebView 页面和原生小程序页面可以通过 postMessage 来进行数据传递。 WebView 页面向原生小程序发…...

kotlin中的flow使用,Flow跟生命周期结合

kotlin的Flow可以连续异步发出多个数据。 1. 普通flow,冷流类似于一个函数&#xff0c;当开始收集时才开始运行 val coldStream flow {for (i in 1..5) {delay(100L)emit(i)}} val collect1 buildString {coldStream.collect { append(it).append(", ") } }.remo…...

讲一下ZooKeeper的持久化机制?

大家好&#xff0c;我是锋哥。今天分享关于【讲一下ZooKeeper的持久化机制&#xff1f;】面试题。希望对大家有帮助&#xff1b; 讲一下ZooKeeper的持久化机制&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ZooKeeper 是一个开源的分布式协调服务&…...

mybatis里面实现动态升降序

问题 最近有一个需求&#xff0c;需要前端告诉后端按照某个字段进行排序。这里主要侧重mybatis的xml实现&#xff0c;其他Spring集成就忽略了。 mapper xml实现 <if test"sortField ! null and sortField ! ">ORDER BY<choose><when test"sor…...

探索网络安全:浅析文件上传漏洞

前言 在数字化时代&#xff0c;网络安全已成为我们每个人都需要关注的重要议题。无论是个人隐私保护&#xff0c;还是企业数据安全&#xff0c;网络威胁无处不在。了解网络安全的基本知识和防护措施&#xff0c;对我们每个人来说都至关重要。 网络安全 网络安全并非只是对网…...

【C++】B2112 石头剪子布

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述游戏规则&#xff1a;输入格式&#xff1a;输出格式&#xff1a;输入输出样例&#xff1a;解题分析与实现 &#x1f4af;我的做法实现逻辑优点与不足 &#x1f4af…...