返回顶部
首页 > 资讯 > 后端开发 > GO >Golang 装饰器函数的哪些参数
  • 714
分享到

Golang 装饰器函数的哪些参数

2024-02-09 05:02:31 714人浏览 独家记忆
摘要

PHP小编百草为大家介绍一下golang装饰器函数的参数。在Golang中,装饰器函数是一种特殊的函数,可以用来包装其他函数,为其添加额外的功能。装饰器函数通常有三个参数:原始函数、装

PHP小编百草为大家介绍一下golang装饰器函数的参数。在Golang中,装饰器函数是一种特殊的函数,可以用来包装其他函数,为其添加额外的功能。装饰器函数通常有三个参数:原始函数、装饰器函数的参数和返回值。原始函数是需要被装饰的函数,装饰器函数的参数可以是任意类型,可以用来传递额外的参数给装饰器函数,返回值通常是一个函数,该函数会替代原始函数的执行。通过这些参数,我们可以实现各种灵活的装饰器模式,为函数添加不同的功能,提高代码的可复用性和可扩展性。

问题内容

我想在 adminapi 的几个方法上使用设置器,例如 update。为此,我创建了一个可以与其他方法匹配的方法类型。

我应该使用接口而不是 func type 吗?

type adminapi struct {
}

type toadminctx func(ctx context.context, req interface{}) (interface{}, error)

func (a adminapi) adminm2msetter(s toadminctx) toadminctx {
    return func(ctx context.context, arg interface{}) (interface{}, error) {
        m2mprincipal, _ := a.getm2mprincipal(ctx)
        ctxm2m := extlib.setprincipal(ctx, m2mprincipal)
        return s(ctxm2m, arg)
    }
}

func (a adminapi) update(ctx context.context, req *reQtype) (resptype, error) {}
updateWithAdminCtx := a.adminAPI.AdminM2MSetter(s.adminAPI.Update)
// ERROR => cannot use s.adminAPI.Update (value of type func(ctx 
// context.Context, req *ReqType) (RespType, error)) as grpcAdmin.ToGetAdminCtx value in 
// argument to s.adminAPI.AdminM2MSetter

_, err := updateWithAdminCtx(ctx context.Context, req *ReqType)

解决方法

我认为您遇到的错误是不言自明的:

a.adminapi.adminm2msetter(s.adminapi.update)

正在通话

func (a adminapi) adminm2msetter(s toadminctx) toadminctx {

传入 s.adminapi.update 作为参数,预计类型为 toadminctx。您的该类型定义为:

type toadminctx func(ctx context.context, req interface{}) (interface{}, error)

但是您的 update 函数的第二个参数是 *reqtype,其第一个返回值是 resptype 值,因此 update 不是 toadminctxtoadminctx 函数类型是可以使用上下文和字面上的任何类型调用的函数。您的 update 函数不能保证在 toadminctx 函数可以的所有情况下都能工作。

您正在寻找的是一种“包装”任何函数的方法,添加对 ctx 参数做一些工作(可能设置一些值),然后传递调用。在 go 1.19 之前,我们通过添加某种包装类型来做到这一点,如下所示:

type wrapper struct {
    updatereqtype *reqtype
    anothertype *reqtype2 // for some other call you want to wrap
}

更改所有相关函数,例如 update 函数以采用包装器参数类型:

func (a adminapi) update(ctx context.context, req wrapper) (resp, error) {
    realreq := req.updatereqtype // get the actual request used here
}

响应类型将被类似地包装和/或组合。

现在,go 支持泛型,在这种情况下它们非常有用,让我们将 adminm2msetter 函数更改为如下所示:

func adminm2msetter[t any, r any](s func(context.context, t) (r, error)) func(context.context, t) (r, error) {
    return func (ctx context.context, arg t) (r, error) {
        m2mprincipal, _ := a.getm2mprincipal(ctx)
        ctxm2m := extlib.setprincipal(ctx, m2mprincipal)
        return s(ctxm2m, arg)
    }
}

这样,我们只需要定义这个函数一次,而是依靠编译器为我们需要的所有类型生成一个量身定制的函数。对于 update 函数,我们会执行以下操作:

a.adminapi.adminm2msetter[*reqtype, resptype](s.adminapi.update)

本质上是用 update 函数使用的特定类型替换通用 tr 类型。因为我真的不知道你想以这种方式包装什么函数,所以我使用了 t any, r any,但是因为在我看来你正在尝试包装某种类型的请求处理程序,所以你可以创建自己的约束:

type Requests interface {
    *ReqType1 | *ReqType2 | *ReqType3 // and so on
}
type Responses interface {
    Resp1 | Resp2 | Resp3
}

只需将 [t any, r any] 替换为 [t requests, r responses]

以上就是Golang 装饰器函数的哪些参数的详细内容,更多请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Golang 装饰器函数的哪些参数

本文链接: https://lsjlt.com/news/562196.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Golang 装饰器函数的哪些参数
    php小编百草为大家介绍一下Golang装饰器函数的参数。在Golang中,装饰器函数是一种特殊的函数,可以用来包装其他函数,为其添加额外的功能。装饰器函数通常有三个参数:原始函数、装...
    99+
    2024-02-09
  • python3--函数的有用信息,带参数的装饰器,多个装饰器装饰同一个函数
    开放封闭原则1 对扩展是开放的    为什么要对扩展开放呢?    我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改,所以我们必须允许代码扩展,添加新功能2 对修...
    99+
    2023-01-30
    函数 多个 有用
  • python函数装饰器构造和参数传递
    目录一.闭包函数二.python装饰器构造三.python装饰器叠加四.python装饰器传参1.装饰器单个参数传递2.装饰器多个参数传递3.装饰器的不定长参数五、带返回值的装饰器前...
    99+
    2024-04-02
  • Python函数的装饰器
    函数的装饰器. 1. 装饰器   开闭原则:         对功能的扩展开放         对代码的修改是封闭     通用装饰器语法: def wrapper(fn): def inner(*args, **kw...
    99+
    2023-01-30
    函数 Python
  • python 装饰器(二): 加参数
    接上篇python 闭包&装饰器(一) 一、功能函数加参数:实现一个可以接收任意数据的加法器 源代码如下: def show_time(f): def inner(*x, **y): # 形参 ...
    99+
    2023-01-30
    参数 python
  • python装饰器1:函数装饰器详解
    装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函数 方法 类 基础...
    99+
    2023-01-30
    详解 函数 python
  • Python装饰器-闭包与函数装饰器
    一、闭包在学习装饰器前,需要先了解闭包的概念。形成闭包的要点:函数嵌套将内部函数作为外部函数的返回值内部函数必须要使用到外部函数的变量下面以一个计算列表平均值的案例来讲解闭包:def make_average(): # 创建一个列表,用来保...
    99+
    2023-05-14
    Python 函数 装饰器
  • 装饰器函数笔记
    装饰器为其他函数增加功能,就是写一个函数,这个函数供其他开发人员调用的的。装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插...
    99+
    2023-01-30
    函数 笔记
  • python之装饰器(函数)
    1. 装饰器   遵循的原则:     开闭原则:   对功能的扩展开放  对代码的修改是封闭 # 通用装饰器写法 # 存在的意义: 在不破坏原有函数和原有函数调用的基础上,给函数添加新的功能. def wrapper...
    99+
    2023-01-30
    函数 python
  • 怎么在python中修饰带参数的装饰器
    本篇文章给大家分享的是有关怎么在python中修饰带参数的装饰器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python的五大特点是什么python的五大特点:1.简单易学,...
    99+
    2023-06-14
  • Python中怎么使用装饰器装饰函数
    这篇文章将为大家详细讲解有关Python中怎么使用装饰器装饰函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。***个函数deco是装饰函数,它的参数就是被装饰的函数对象。我们可以在deco...
    99+
    2023-06-17
  • 带参数的全类型 Python 装饰器
    这篇短文中显示的代码取自我的小型开源项目按合同设计,它提供了一个类型化的装饰器。装饰器是一个非常有用的概念,你肯定会在网上找到很多关于它们的介绍。简单说,它们允许在每次调用装饰函数时(之前和之后)执行代码。通过这种方式,你可以修改函数参数或...
    99+
    2023-05-14
    Python 装饰器
  • python装饰器管理函数和类的注意点有哪些
    这篇文章主要介绍了python装饰器管理函数和类的注意点有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python的五大特点是什么python的五大特点:1.简单易学,...
    99+
    2023-06-14
  • Python 函数装饰器详解
    目录使用场景授权(Authorization)日志(Logging)带参数的装饰器在函数中嵌入装饰器装饰器类总结装饰器(Decorators)是 Python 的一个重要部分。简单地...
    99+
    2024-04-02
  • Python有哪些函数参数
    本篇内容介绍了“Python有哪些函数参数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、函数参数匹配表语法位置解释func(value)...
    99+
    2023-06-02
  • golang函数的参数传递
    Go 函数的参数传递 在 Go 中,函数通过值传递或引用传递传递参数。了解这两种传递方式之间的差异对于优化代码性能和避免意外行为至关重要。 值传递 当以值传递方式传递参数时,函数会收到...
    99+
    2024-04-20
    函数 参数传递 golang
  • socket bind函数的参数有哪些
    socket bind函数的参数有以下几个:1. sockfd:要绑定的socket描述符。2. addr:一个指向sockaddr...
    99+
    2023-09-26
    socket
  • c++ main函数的参数有哪些
    C++的main函数通常有两个参数,它们是:1. argc(argument count):表示命令行参数的个数,包括执行文件本身。...
    99+
    2023-09-05
    c++
  • python plot函数的参数有哪些
    plot函数的常见参数包括: x:指定x轴的数据,可以是一个数组或者是一个标量 y:指定y轴的数据,可以是一个数组或者是一个标量 ...
    99+
    2023-10-21
    python
  • PHP define()函数的参数有哪些
    在 PHP 中,`define()` 函数用于定义一个常量。它接受两个必填参数和一个可选参数。下面是 `define()` 函数的参...
    99+
    2023-10-11
    PHP
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作