• 2010年08月04日 Go生态洞察:Defer, Panic, Recover 深度解析



    🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁

    🦄 博客首页——🐅🐾猫头虎的博客🎐
    🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺
    🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐
    🌊 《100天精通Golang(基础入门篇)》 🐅 学会Golang语言,畅玩云原生,走遍大小厂~💐

    🐅🐾猫头虎建议Go程序员必备技术栈一览表📖:

    ☁️🐳 Go语言开发者必备技术栈☸️:
    🐹 GoLang | 🌿 Git | 🐳 Docker | ☸️ Kubernetes | 🔧 CI/CD | ✅ Testing | 💾 SQL/NoSQL | 📡 gRPC | ☁️ Cloud | 📊 Prometheus | 📚 ELK Stack


    🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🐅🐾🍁🐥


    在这里插入图片描述

    • 原创作者: 猫头虎

    • 作者wx: [ libin9iOak ]

    • 作者公众号: [ 猫头虎技术团队 ]

    在这里插入图片描述

    2010年08月04日 Go生态洞察:Defer, Panic, Recover 深度解析


    🐆 摘要

    嘿,Go语言爱好者们,猫头虎博主今天来带大家深入探讨Go的三个控制流机制:defer, panic和recover。这些机制不像if和for那样常见,但它们提供了Go语言特有的强大功能,特别是在错误处理和资源管理方面。这篇文章将详细介绍这三个关键字的用法和它们的内部工作原理。 Go错误处理、Go资源管理、Go控制流。

    🎩 引言

    在Go的世界里,除了我们熟悉的控制流结构,如if, for, switch, goto外,Go还提供了一些独特的控制流关键字:defer, panic和recover。这些机制对于任何想要精通Go的开发者来说都是至关重要的。今天,我们就来详细解析这三个不那么常见但极其重要的Go语言特性。

    📖 正文内容

    1. 理解 Defer

    Defer关键字用于预定函数调用,这些调用会在包含它们的函数返回后执行。它通常用于简化执行多种清理动作的函数。

    1.1 Defer的使用
    func CopyFile(dstName, srcName string) (written int64, err error) {
        src, err := os.Open(srcName)
        if err != nil {
            return
        }
        defer src.Close()
    
        dst, err := os.Create(dstName)
        if err != nil {
            return
        }
        defer dst.Close()
    
        return io.Copy(dst, src)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这个例子中,无论函数有多少个返回路径,defer确保文件最终都会关闭。

    1.2 Defer的执行规则

    Defer遵循三个简单的规则:

    • Defer语句中的函数调用其参数会立即求值,但直到外围函数返回前不执行。
    • Defer调用按LIFO顺序执行。
    • Defer函数可以读取和修改返回函数的命名返回值。

    2. Panic的机制

    Panic是一个内置函数,用于停止正常的控制流程并开始异常处理流程。当发生panic时,将会按照LIFO顺序执行所有deferred函数,然后程序崩溃。

    func causePanic() {
        panic("something bad happened")
    }
    
    func main() {
        defer fmt.Println("This will be printed after panic but before program crashes.")
        causePanic()
        fmt.Println("This will not be printed.")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3. Recover的恢复策略

    Recover是一个内置函数,它可以重新获得控制权,并继续正常执行。

    func mayPanic() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("Recovered from error:", r)
            }
        }()
        panic("something bad happened")
    }
    
    func main() {
        mayPanic()
        fmt.Println("The application continues to run...")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4. 综合示例

    以下是一个综合使用defer, panic和recover的示例,演示了如何在Go中进行错误恢复。

    package main
    
    import "fmt"
    
    func main() {
        f()
        fmt.Println("Returned normally from f.")
    }
    
    func f() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("Recovered in f", r)
            }
        }()
        fmt.Println("Calling g.")
        g(0)
        fmt.Println("Returned normally from g.")
    }
    
    func g(i int) {
        if i > 3 {
            fmt.Println("Panicking!")
            panic(fmt.Sprintf("%v", i))
        }
        defer fmt.Println("Defer in g", i)
        fmt.Println("Printing in g", i)
        g(i + 1)
    }
    
    // 这个示例演示了如果g中的i大于3,会产生panic。
    // f中的defer函数包含recover,能够捕获panic并恢复执行。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    🧐 总结

    通过今天的文章,我们对Go中的defer, panic和recover有了更深刻的理解。这些强大的工具可以帮助我们更优雅地处理错误和清理资源。由于它们的独特性,Go程序员可以编写出更加健壮和易于维护的代码。猫头虎博主很开心这篇文章被Go生态洞察专栏收录,希望它能帮助你更好地理解Go中的异常处理和资源管理。

    📘 参考资料

    • The Go Programming Language Specification
    • “Effective Go” documentation
    • Andrew Gerrand’s blog posts

    🚀 下一篇预告

    下一篇我们将探讨Go在2010年获得的Bossie奖,看看是哪些特性让Go在众多编程语言中脱颖而出。别错过了,敬请期待!


    在代码的海洋中,我们下次见!😸🌊

    在这里插入图片描述

    原创声明

    ======= ·

    • 原创作者: 猫头虎

    • 作者wx: [ libin9iOak ]
      在这里插入图片描述

    • 作者公众号: [ 猫头虎技术团队 ]

    在这里插入图片描述

    学习复习Go生态

    本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

    作者保证信息真实可靠,但不对准确性和完整性承担责任

    未经许可,禁止商业用途。

    如有疑问或建议,请联系作者。

    感谢您的支持与尊重。

    点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,洞察Go生态,共同成长。

  • 相关阅读:
    Java集合
    [Modbus] Modbus协议开发-工作流程(二)
    Java中的abstract抽象类的匿名子类模板方法的设计模式
    docker23.0.1版本修改容器存储镜像的位置在哪里改
    【Java 基础篇】Java网络编程实战:P2P文件共享详解
    CDC Schemes
    C++ Primer笔记002:引用/指针/const
    [羊城杯 2022]LRSA
    2.06_python+Django+mysql实现pdf转word项目_项目开发-创建模型
    南昌大学漏洞报送证书
  • 原文地址:https://blog.csdn.net/qq_44866828/article/details/134289744