我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Golang 装饰器函数的哪些参数

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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 装饰器函数的哪些参数的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Golang 装饰器函数的哪些参数

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Golang 装饰器函数的哪些参数

php小编百草为大家介绍一下Golang装饰器函数的参数。在Golang中,装饰器函数是一种特殊的函数,可以用来包装其他函数,为其添加额外的功能。装饰器函数通常有三个参数:原始函数、装饰器函数的参数和返回值。原始函数是需要被装饰的函数,装饰
Golang 装饰器函数的哪些参数
2024-02-09

python3--函数的有用信息,带参数的装饰器,多个装饰器装饰同一个函数

开放封闭原则1 对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改,所以我们必须允许代码扩展,添加新功能2 对修改是封闭的 为什么要对修改封闭呢? 就像我们
2023-01-30

Python函数的装饰器

函数的装饰器. 1. 装饰器   开闭原则:         对功能的扩展开放         对代码的修改是封闭     通用装饰器语法:def wrapper(fn): def inner(*args, **kwargs): #
2023-01-30

python装饰器1:函数装饰器详解

装饰器1:函数装饰器装饰器2:类装饰器装饰器3:进阶先混个眼熟谁可以作为装饰器(可以将谁编写成装饰器):函数方法实现了__call__的可调用类装饰器可以去装饰谁(谁可以被装饰):函数方法类基础:函数装饰器的表现方式假如你已经定义了一个函数
2023-01-30

python 装饰器(二): 加参数

接上篇python 闭包&装饰器(一) 一、功能函数加参数:实现一个可以接收任意数据的加法器 源代码如下: def show_time(f): def inner(*x, **y): # 形参 start = t
2023-01-30

装饰器函数笔记

装饰器为其他函数增加功能,就是写一个函数,这个函数供其他开发人员调用的的。装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入
2023-01-30

python之装饰器(函数)

1. 装饰器   遵循的原则:     开闭原则:   对功能的扩展开放  对代码的修改是封闭# 通用装饰器写法# 存在的意义: 在不破坏原有函数和原有函数调用的基础上,给函数添加新的功能.def wrapper(fn): #
2023-01-30

怎么在python中修饰带参数的装饰器

本篇文章给大家分享的是有关怎么在python中修饰带参数的装饰器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python的五大特点是什么python的五大特点:1.简单易学,
2023-06-14

Python中怎么使用装饰器装饰函数

这篇文章将为大家详细讲解有关Python中怎么使用装饰器装饰函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。***个函数deco是装饰函数,它的参数就是被装饰的函数对象。我们可以在deco
2023-06-17

python装饰器管理函数和类的注意点有哪些

这篇文章主要介绍了python装饰器管理函数和类的注意点有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python的五大特点是什么python的五大特点:1.简单易学,
2023-06-14

Python有哪些函数参数

本篇内容介绍了“Python有哪些函数参数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、函数参数匹配表语法位置解释func(value)
2023-06-02

golang函数的参数传递

Go 函数的参数传递在 Go 中,函数通过值传递或引用传递传递参数。了解这两种传递方式之间的差异对于优化代码性能和避免意外行为至关重要。值传递当以值传递方式传递参数时,函数会收到参数值的副本。这意味着对参数值的任何修改都不会影响函数外
golang函数的参数传递
2024-04-20

PHP define()函数的参数有哪些

在 PHP 中,`define()` 函数用于定义一个常量。它接受两个必填参数和一个可选参数。下面是 `define()` 函数的参数列表:1. `name`(必填):指定常量的名称。常量名可以是任意有效的标识符,但通常使用全大写字母和下划
2023-10-11

Python中怎么使用装饰器来装饰函数

在Python中,装饰器是一种函数,它接受一个函数作为参数,并返回一个新的函数。通过使用装饰器,可以在不修改原始函数代码的情况下添加额外的功能或逻辑。下面是一个简单的示例,演示如何使用装饰器来装饰函数:# 定义一个装饰器函数def m
Python中怎么使用装饰器来装饰函数
2024-03-12

c++ main函数的参数有哪些

C++的main函数通常有两个参数,它们是:1. argc(argument count):表示命令行参数的个数,包括执行文件本身。2. argv(argument vector):是一个指向指针数组的指针,其中每个指针指向一个命令行参数的
2023-09-05

socket bind函数的参数有哪些

socket bind函数的参数有以下几个:1. sockfd:要绑定的socket描述符。2. addr:一个指向sockaddr结构体的指针,其中包含了要绑定的地址信息,包括IP地址和端口号。3. addrlen:sockaddr结构体
2023-09-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录