GO语言匿名函数的几种使用方式

本文主要介绍了GO语言匿名函数的几种使用方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

目录
  • 匿名函数说明
  • 基本语法
  • 匿名函数的几种使用方式
    • 直接定义并调用(立即执行函数)
    • 赋值给变量,后续调用
    • 作为函数参数(回调函数)

匿名函数说明

在Go语言中,匿名函数(Anonymous Function)是一种没有名称的函数定义方式,可以直接定义并使用,或者赋值给变量。Go语言中的匿名函数也被称为函数字面量(Function Literal)。

基本语法

func(参数列表) 返回值类型 {
    // 函数体
}

匿名函数的几种使用方式

直接定义并调用(立即执行函数)

这种调用方式和直接把功能写在函数中的区别:
1、将无法复用功能块独立出来,一个功能使用一段代码,结果清晰。
2、匿名函数中定义的变量有自己的空间,不会污染外部的变量。

package main

import "fmt"

func main() {
    // 定义并立即执行
    func() {
        fmt.Println("这是一个匿名函数")
    }()  // 注意这里的括号表示立即调用

    // 带参数的立即执行匿名函数
    func(msg string) {
        fmt.Println("收到消息:", msg)
    }("Hello, Go!")
}

赋值给变量,后续调用

这里将匿名函数赋值给函数指针变量add,后续直接调用函数指针变量add就相当于调用匿名函数。

package main

import "fmt"

func main() {
    // 将匿名函数赋值给变量
    add := func(a, b int) int {
        return a + b
    }

    result := add(3, 5)
    fmt.Println("3 + 5 =", result)  // 输出: 3 + 5 = 8
}

作为函数参数(回调函数)

package main

import "fmt"

// 接受函数作为参数的函数
func calculate(a, b int, op func(int, int) int) int {
    return op(a, b)
}

func main() {
    sum := calculate(10, 20, func(x, y int) int {
        return x + y
    })
    
    product := calculate(10, 20, func(x, y int) int {
        return x * y
    })
    
    fmt.Println("Sum:", sum)       // 输出: Sum: 30
    fmt.Println("Product:", product) // 输出: Product: 200
}

下面这个用法对于新手可能难以理解,博主来仔细拆解一下。
首先是函数的定义:

再来看看函数的调用和匿名函数的实现:

到此这篇关于GO语言匿名函数的几种使用方式的文章就介绍到这了,更多相关GO语言匿名函数内容请搜索骃骐网以前的文章或继续浏览下面的相关文章希望大家以后多多支持骃骐网! 

您可能感兴趣的文章:

  • 如何在Go语言中灵活运用匿名函数和闭包
  • 一文带你了解Go语言中的匿名函数
  • GO语言不固定参数函数与匿名函数的使用
  • Go语言中init函数与匿名函数使用浅析
  • Go语言func匿名函数闭包示例详解
  • go语言中匿名函数的作用域陷阱详解
  • go语言匿名函数的使用

相关推荐:

Python中如何对NumPy数组执行快速幂运算_使用power函数实现向量化

np.power 比 快因底层C向量化实现,避免Python循环开销;支持out/where/dtype等参数,更安全可控;对负底数非整指数默认报错,而 静默返回nan;np.float_power专为负底数浮点指数设计。 为什么 np.power 比循环调用 ** 快得多 因为 np.power 是底层 C 实现的向量化函数,它一次性处理整个数组,避免 Python 循环开销和逐元素类型检查。而...

如何在Python中实现带参数的装饰器_通过三层函数嵌套传递外部参数

带参数的装饰器必须三层:外层接收参数并返回装饰器,中层接收函数,内层接收调用参数;不加@functools.wraps会导致__name__、__doc__等元信息丢失,影响调试、反射和IDE功能;参数校验应放在外层。 为什么带参数的装饰器必须用三层函数 因为 Python 的 @ 语法只接受一个可调用对象作为装饰器,而你传进去的 @log(level="DEBUG") 实际上是先执行 log(l...

如何在对象属性批量更新后仅执行一次回调函数

本文介绍一种优雅的 python 设计模式:通过私有属性 + 只读属性 + 显式 update() 方法,确保对象状态变更时回调函数(如数据校验、视图刷新等)仅被触发一次,避免重复计算,同时保持 ide 类型提示与代码可维护性。 本文介绍一种优雅的 python 设计模式:通过私有属性 + 只读属性 + 显式 update() 方法,确保对象状态变更时回调函数(如数据校验、视图刷新等)仅被触发一次...

Python中如何求NumPy数组的百分位数_使用percentile函数进行统计

numpy.percentile用于计算数组指定百分位数,关键参数包括a(输入数组)、q(0–100间百分位数)、axis(计算轴,默认None展平);含NaN需设nan_policy='omit';method控制插值方式;keepdims配合axis保留维度。 percentile函数的基本用法和参数含义 numpy.percentile 是计算数组中指定百分位数的主力函数,它不修改原数组,返...

如何确保对象属性批量更新后仅触发一次回调函数

本文介绍一种优雅的 Python 设计方案:通过禁用直接属性赋值 + 提供类型安全的 update() 方法,实现在多个属性变更后统一、且仅执行一次回调函数,兼顾 IDE 智能提示、代码可维护性与运行时可靠性。 本文介绍一种优雅的 python 设计方案:通过禁用直接属性赋值 + 提供类型安全的 `update()` 方法,实现在多个属性变更后统一、且仅执行一次回调函数,兼顾 ide 智能提示、代...

Python如何实现图的深度优先遍历_基于栈结构或递归函数实现

递归DFS栈溢出风险高因CPython默认递归深度仅1000,长链或环易触发RecursionError;隐式栈不可控,闭包和帧对象加剧内存开销;图应优先用显式栈实现。 递归实现DFS时,为什么栈溢出风险比预期高? Python默认递归深度限制是1000层,图中存在长链或环状结构时极易触发RecursionError。这不是算法错,而是CPython解释器对递归调用的硬性约束。 用sys.setr...

如何使用Python中的calendar模块判断闰年_调用isleap函数

应直接使用 calendar.isleap() 判断闰年,它准确实现公历规则、线程安全、性能优且自 Python 2.3 起稳定兼容,避免手写逻辑出错或误用类型。 直接用 calendar.isleap() 判定闰年,别自己写逻辑 Python 的 calendar.isleap() 是最可靠、最省事的闰年判断方式。它封装了格里高利历(公历)全部规则:能被 4 整除但不能被 100 整除,或能被 ...

Python中如何获取当前正在运行的所有异步任务_使用asyncio.all_tasks函数

asyncio.all_tasks 返回当前事件循环中所有未完成的Task对象集合(set),为空常因未启动事件循环、无活跃循环、任务已完结或跨线程未正确设置循环。 asyncio.all_tasks 返回什么,为什么有时为空 asyncio.all_tasks 返回当前事件循环中所有未完成的 Task 对象集合(set),但它**只作用于当前线程中已运行且未关闭的事件循环**。常见误区是直接调用...

如何修复Python中NumPy不支持中文路径的问题_通过open函数读取字节流

NumPy的loadtxt等函数无法读取中文路径的根本原因在于其底层调用C标准库fopen时依赖系统默认编码(如Windows的GBK),而Python 3传递的是Unicode字符串,未做显式编码适配,导致OSError或UnicodeDecodeError;正确做法是用open('rb')读字节流,再经io.BytesIO包装后传入NumPy函数。 NumPy的loadtxt、genfromt...

Python内置函数有哪些_常用BIF如len/max/min/sum汇总

Python内置函数是类型协议的快捷入口,如len()调用__len__()、max()依赖__iter__()和比较方法,理解此机制可避免参数类型错误与兼容性问题。 Python内置函数不是“功能列表”,而是“类型协议的快捷入口” Python的内置函数(BIF)绝大多数不是独立实现的逻辑,而是对对象__len__、__iter__、__lt__等特殊方法的统一调用封装。比如len(x)实际触发...