go 闭包case示例代码

 更新时间:2025年02月19日 08:48:36   作者:仁义礼智信的  
这篇文章解释了Go语言中匿名函数、闭包、立即执行函数表达式(IIFE)和变量作用域的概念,它通过一个示例代码展示了匿名函数如何捕获并修改外部变量,以及如何使用立即执行函数表达式来立即执行这个匿名函数,感兴趣的朋友一起看看吧

你提到的代码片段是一个匿名函数,并且它在定义后立即执行(即 IIFE,立即执行函数表达式)。这个匿名函数内部对 z = x / y 的赋值操作能够影响到外部变量的原因在于 Go 语言的作用域规则和闭包机制。

解释

  • 闭包机制

    • 匿名函数可以访问其定义时所在作用域中的变量。这种特性称为闭包。在你的例子中,匿名函数捕获了外部的 zx 和 y 变量。
  • 变量作用域

    • 如果 zx 和 y 是在匿名函数外部声明的变量(例如在 main 函数中),那么这些变量是全局可见的,或者至少在匿名函数的作用域链中是可见的。
    • 当你在匿名函数内部修改这些变量时,实际上是在修改这些变量的原始内存位置,因此这些变化会反映到外部。
  • 立即执行函数表达式 (IIFE)

    • 匿名函数定义后立即执行,这意味着它的副作用(如变量赋值)会立即生效。

示例代码分析

假设完整的代码如下:

package main
import "fmt"
func main() {
    var x, y, z int
    x = 10
    y = 2
    func() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("recovered from ", r)
            }
        }()
        z = x / y
    }()
    fmt.Println("Result:", z) // 输出: Result: 5
}

在这个例子中:

  • xy 和 z 是在 main 函数中声明的变量。
  • 匿名函数捕获了这些变量,并在其内部进行了 z = x / y 的计算。
  • 由于 z 是在 main 函数中声明的,因此匿名函数内部对 z 的修改会影响到 main 函数中的 z

关键点总结

  • 闭包:匿名函数可以访问并修改其定义时所在作用域中的变量。
  • 立即执行:匿名函数定义后立即执行,其副作用会立即生效。
  • 变量作用域:如果变量在外部作用域中声明,则匿名函数内部可以访问和修改这些变量。

注意事项

  • 确保 y 不为零,以避免除零错误。你可以添加检查逻辑来防止这种情况发生。
func main() {
    var x, y, z int
    x = 10
    y = 2
    func() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("recovered from ", r)
            }
        }()
        if y == 0 {
            panic("division by zero")
        }
        z = x / y
    }()
    fmt.Println("Result:", z)
}

这样可以确保程序在 y 为零时不会崩溃,并且能够正确恢复。

到此这篇关于go 闭包case的文章就介绍到这了,更多相关go 闭包case内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go 1.21新增的slices包中切片函数用法详解

    Go 1.21新增的slices包中切片函数用法详解

    Go 1.21新增的 slices 包提供了很多和切片相关的函数,可以用于任何类型的切片,本文通过代码示例为大家介绍了部分切片函数的具体用法,感兴趣的小伙伴可以了解一下
    2023-08-08
  • Golang之sync.Pool对象池对象重用机制总结

    Golang之sync.Pool对象池对象重用机制总结

    这篇文章主要对Golang的sync.Pool对象池对象重用机制做了一个总结,文中有相关的代码示例和图解,具有一定的参考价值,需要的朋友可以参考下
    2023-07-07
  • HTTP服务压力测试工具及相关术语讲解

    HTTP服务压力测试工具及相关术语讲解

    这篇文章主要为大家介绍了HTTP服务压力测试工具使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 浅析Go使用定时器时如何避免潜在的内存泄漏陷阱

    浅析Go使用定时器时如何避免潜在的内存泄漏陷阱

    这篇文章来和大家一起探讨一下Go 中如何高效使用 timer,特别是与select 一起使用时,如何防止潜在的内存泄漏问题,感兴趣的可以了解下
    2024-01-01
  • Golang 函数执行时间统计装饰器的一个实现详解

    Golang 函数执行时间统计装饰器的一个实现详解

    这篇文章主要介绍了Golang 函数执行时间统计装饰器的一个实现详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Go语言zip文件的读写操作

    Go语言zip文件的读写操作

    本文主要介绍了Go语言zip文件的读写操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 使用Go语言实现读取本地文本文件内容

    使用Go语言实现读取本地文本文件内容

    这篇文章主要为大家详细介绍了如何使用Go语言实现读取本地文本文件内容功能,文中的示例代码简洁易懂,有需要的小伙伴可以参考一下
    2025-07-07
  • Go语言进行多时区时间转换的示例代码

    Go语言进行多时区时间转换的示例代码

    本文介绍了使用Go语言进行多时区时间转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • Go中crypto/rsa库的高效使用指南

    Go中crypto/rsa库的高效使用指南

    本文主要介绍了Go中crypto/rsa库的高效使用指南,从 RSA 的基本原理到 crypto/rsa 库的实际应用,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • go实现脚本解释器gscript

    go实现脚本解释器gscript

    这篇文章主要为大家介绍了go实现脚本解释器gscript示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07

最新评论