延迟函数不恢复

2024-01-12

所以,我一直在摆弄go,我发现下面的函数恢复成功

package main

import (
    "fmt"
)

func a() {  
    defer func(){
        if r := recover(); r != nil {
            fmt.Println("Recovered", r)
        }
    }()
    n := []int{5, 7, 4}
    fmt.Println(n[3])
    fmt.Println("normally returned from a")
}

func main() {  
    a()
    fmt.Println("normally returned from main")
}

但这不是

package main

import (
    "fmt"
)

func r() {  
    if r := recover(); r != nil {
        fmt.Println("Recovered", r)
    }
}

func a() {  
    defer func(){
        r()
    }()
    n := []int{5, 7, 4}
    fmt.Println(n[3])
    fmt.Println("normally returned from a")
}

func main() {  
    a()
    fmt.Println("normally returned from main")
}

有人能解释一下为什么吗?我一直在寻找答案,但没有找到任何我可以完全理解的内容。 谢谢。


仅当直接从延迟函数调用时,调用恢复才会停止恐慌。这是来自的相关文本恢复文档 https://godoc.org/builtin#recover:

在延迟函数(但不是它调用的任何函数)内执行恢复调用可以通过恢复正常执行来停止恐慌序列,并检索传递给恐慌调用的错误值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

延迟函数不恢复 的相关文章

  • 空或不需要的结构字段

    我有两个结构体 代表将插入到 mongodb 数据库中的模型 一个结构 投资 将另一个结构 集团 作为其字段之一 type Group struct Base Name string json name bson name type Inv
  • 地图中的最大元素数

    GO 中的 Map 最多可以存储多少个元素 如果我需要经常从 Map 访问数据 那么在长时间运行的程序中不断向 Map 添加项目并从中检索项目是一个好主意吗 除了map length类型的最大值之外 map中的元素数量没有理论上的限制 in
  • 如果覆盖率低于一定百分比,则单元测试失败

    我制作了一个执行的 makefilego test cover 是否有可能失败make unit tests如果覆盖范围低于 X 则命令 我该怎么做呢 您可以使用TestMain在你的测试中做到这一点 TestMain 可以充当测试的自定义
  • 将具有联合字段的 C 结构映射到 Go 结构

    我从 Go 中的某些 WinApi 的系统调用中获取结果 我可以轻松地从 C 代码映射简单的结构 但是如何处理如下所示的 C 结构 typedef struct SPC LINK DWORD dwLinkChoice define SPC
  • 为什么我不能执行 fmt.Sprintf("%d.%d.%d.%d", a...)?

    我正在学习 Go 但我一直坚持 Go 之旅 exercise stringer go https tour golang org methods 7 https tour golang org methods 7 这是一些代码 type I
  • foo.Name undefined(类型接口{}没有字段或方法名称)

    我使用本机 golang 包 container list 来管理堆栈中的 inotify 事件 当我访问堆栈的项目时 我的类型失败 我认为 import golang org x exp inotify container list lo
  • 如何通过模板中的变量访问对象字段?

    我有一个嵌套循环 columns columns range dx dataList range c columns index dx c end end dataList是orm模型数组 和ID Title字段 那么columns is
  • 在 Go 中执行字节数组

    我正在尝试在 Go 程序中执行 shellcode 类似于使用其他语言执行此操作的方式 示例 1 C 程序中的 Shellcode https stackoverflow com questions 16626857 shellcode i
  • 在 Go 中生成随机、固定长度的字节数组

    我有一个字节数组 固定长度为4 token make byte 4 我需要将每个字节设置为随机字节 我怎样才能以最有效的方式做到这一点 这math rand就我而言 方法不提供随机字节函数 也许有一种内置的方法 或者我应该生成一个随机字符串
  • 为什么奇数的切片容量与偶数的切片行为不同

    我注意到 当容量为奇数时 切片的容量会以不同的方式表现 更具体地说 当向切片添加元素时 切片的容量为doubled当原始容量为偶数时 但当原容量为奇数时 容量为增加一 然后加倍 例子 s make int 28 28 s append s
  • 为什么结构中“[0]byte”的位置很重要?

    0 byte在golang中不应该占用任何内存空间 但这两个结构体的大小不同 type bar2 struct A int 0 byte type bar3 struct 0 byte A int 那么为什么这个位置 0 byte这里重要吗
  • 是否可以获取有关 Golang 中调用者函数的信息?

    是否可以获取有关 Golang 中调用者函数的信息 例如 如果我有 func foo Do something func main foo 我怎样才能得到那个foo已被呼叫来自main 我可以用其他语言实现这一点 例如在 C 中我只需要使用
  • 如何在 Go 中解组具有多个项目的简单 xml?

    我想从以下 xml 中获取人物 People 的一部分
  • 有没有办法在 VSCode 中保存时运行 go 测试,并将其输出到终端?

    现在我有几个项目在VSCode中运行 运行起来相当繁琐go test每次我编写新代码时 我宁愿立即看看我是否破坏了某些东西 我知道在 Javascript 中我可以在每次保存文件时运行测试 并将输出发送到终端 现在我正在使用 保存时运行 h
  • 我怎么知道我的所有 goroutine 确实正在使用 golang 的同步包等待一个条件

    我有一个应用程序 我正在创建多个 goroutine 来同时执行某个任务 所有工作协程都会等待条件 事件发生 一旦事件被触发 它们就会开始执行 创建完所有goroutines后 主线程在发送广播信号之前应该知道所有goroutines确实处
  • 鸭子在 Go 中打字

    我想写一个Join函数接受任意对象String 方法 package main import fmt strings type myint int func i myint String string return fmt Sprintf
  • 模板中的 bson.ObjectId

    我有一个具有 bson ObjectId 类型的结构 例如如下所示 type Test struct Id bson ObjectId Name string Foo string 我想在 html 模板中呈现它 Name Food a h
  • 如何在 Go 中将环境变量传递给测试用例

    在为 Go 编写测试用例时 传递需要提供给测试的环境变量的标准方法是什么 例如 我们不想在测试用例的源代码中嵌入密码 处理这个问题最标准的方法是什么 我们让测试用例寻找配置文件吗 还有别的事吗 看来我偶然发现了答案 将其添加到测试用例中可以
  • 打印到 stdout 会导致阻塞的 goroutine 运行吗?

    作为一个愚蠢的基本线程练习 我一直在尝试实现理发师睡觉的问题 http en wikipedia org wiki Sleeping barber problem在戈兰 对于通道来说 这应该很容易 但我遇到了一个 heisenbug 也就是
  • 在 Go 中初始化嵌入结构

    我有以下内容struct其中包含一个net http Request type MyRequest struct http Request PathParams map string string 现在我想初始化匿名内部结构http Req

随机推荐

  • Spark 对分隔数据进行排序

    我是 Spark 新手 您能告诉我以下代码有什么问题吗 val rawData USA E001 ABC DE 19850607 IT 100 UK E005 CHAN CL 19870512 OP 200 USA E003 XYZ AB
  • 获取上周唯一的最新数据并对某些列求和

    仅获取上周的最新数据并对某些列求和 我用数据 实际结果和预期做了一个例子 http rextester com HMB12638 http rextester com HMB12638 Taking first as example use
  • Select2限制标签数量

    有没有办法限制用户可以使用 Select2 添加到输入字段的标签数量 I have tags select2 containerCssClass supplierTags placeholder Usual suppliers minimu
  • 如何使用 Bash 获取屏幕会话中的命令历史记录?

    如果我开始一个屏幕会话screen dmS name 我如何使用脚本访问该屏幕会话的命令历史记录 Using the the last executed command appears even in screen 我在系统上使用默认的 b
  • 推理 Big O 的正式定义时遇到一些困难

    我的教授最近回顾了 Big O 的正式定义 老实说 即使他向几个不同的学生解释了它 我们似乎仍然没有理解它的核心 理解上的问题主要出现在我们经历的以下例子中 到目前为止 我的推理如下 当您将函数的最高项乘以常数时 您会得到一个新函数 该新函
  • 循环变量覆盖全局变量

    在Python中 为什么循环变量会覆盖已经定义的全局变量 将循环变量放入模块的全局命名空间而不是仅用于循环的新本地命名空间似乎违反直觉 这是一个显示我正在谈论的内容的示例 c 3 14 print before loop c format
  • 如何从 Blazor 中的另一个组件重新渲染组件?

    我有一个电子商务Blazor服务器项目 我想重新渲染推车组件将商品添加到购物车后产品组件 我尝试将 Cart 组件继承到 Product 组件 并运行 Cart 组件的公共方法来重新渲染其组件 添加到购物车方法产品组件 产品 剃须刀 pub
  • 如何对一周中每一天的每个小时进行分组和绘图

    我需要帮助弄清楚如何绘制子图 以便与显示的数据框进行轻松比较 Date A B C 2017 03 22 15 00 00 obj1 value a other 1 2017 03 22 14 00 00 obj2 value ns oth
  • Jenkins 管道:kubectl:未找到

    我有以下 Jenkinsfile node stage Apply Kubernetes files withKubeConfig credentialsId jenkins deployer serverUrl https 192 168
  • 当 AngularJS 控制器加载时运行一次

    我有一些事情只需要在控制器加载时完成一次 最好的方法是什么 我读过一些有关 运行块 的内容 但我不太明白它是如何工作的 一些伪代码 when app resolove some stuff load a view controllerA C
  • 如何使用 SnakeYaml 加载自定义对象列表

    我一直在尝试将以下 yaml 反序列化为List
  • Jenkins 蓝海:Maven 看不到 Java

    即使路径存在 我也收到错误 var jenkins home tools hudson model JDK jdk8 bin java 未找到 edi debatcher master LNI22Y2C5V3VECCBCFPVB3ZUWJJ
  • 如何检查双精度数是否可以放入浮点数而不转换为无穷大

    是否有一种标准方法来检查 64 位浮点数是否可以转换为 32 位浮点数而不转换为 Infinity 我知道事后可以检查 Inf Convert ToSingle 不会这样做 为了测试是否double value d将转换为float在不产生
  • 如何强制 PhpMailer 5.2 使用 TLS 1.2

    最近我使用的第三方电子邮件服务提供商发生了变化 他们禁用了对 TLS 1 0 和 TLS 1 1 的支持 我为仍然使用 php 5 3 和 phpmailer 5 2 的古老系统提供支持 我的测试表明 TLS 1 2 已启用 但是 禁用 T
  • 使用带有自定义键的 HashMap

    快速问题 如果我想使用HashMap以自定义类为键 must我覆盖hashCode功能 如果我不重写该函数 它将如何工作 如果您不覆盖 hashCode AND equals 您将获得默认行为 即每个对象都是不同的 无论其内容如何
  • WF4 InstancePersistenceCommand 中断

    我有一个 Windows 服务 正在运行工作流程 工作流程是从数据库加载的 XAML 用户可以使用重新托管的设计器定义自己的工作流程 它配置有一个 SQLWorkflowInstanceStore 实例 以便在空闲时保留工作流 它基本上源自
  • 有什么方法可以判断任意 .docx 文件是否采用 Strict Office Open XML 格式与过渡格式? (ECMA-376)

    我在网上搜索过 没有找到任何程序或工具可以区分那些编码为严格 ECMA 376 和非严格 ECMA 376 的 docx 文件 对于 xlsx 文件也是如此 大多数讨论都集中在给定应用程序支持哪些格式 例如LibreOffice 但不知道如
  • 一起录制视频和屏幕并用 Javascript 覆盖

    我想在网络摄像头旁边记录用户的屏幕并将结果显示为叠加层 如下所示 我假设在录制时我可以在两个单独的视频元素中显示多个流并用 CSS 覆盖它们 然而 我该如何save结果是两个视频的叠加 这可以在纯 JS 中实现 如下所示 通过 getUse
  • 为什么建议在 .NET 中使用反射?

    使用它绝对是一个好的做法吗 项目中有哪些可能的情况需要反思 反射的主要价值在于它可用于检查程序集 类型和成员 它是一个非常强大的工具 用于确定未知程序集或对象的内容 并且可用于多种情况 Reflection 的反对者会说它很慢 与静态代码执
  • 延迟函数不恢复

    所以 我一直在摆弄go 我发现下面的函数恢复成功 package main import fmt func a defer func if r recover r nil fmt Println Recovered r n int 5 7