当前位置: 首页 > news >正文

左耳听风_114_113_Go编程模式修饰器

你好,我是陈浩,我名多尔多house.之前呢我写过一篇文章叫做python修饰器的函数式编程。

那这种模式呢可以很轻松的把一些函数啊装配到另外一些函数上。

让你的代码呢更加简单,也可以让一些小功能性的代码复用性更高。

让代码中的函数呢可以像乐高玩具那样自由的拼装。

所以说一直以来呢我都对修饰器这种编程模式啊情有独钟。

那这节课呢我们就来聊一聊构元里面的修饰器编程模式。

那如果你看过我刚说的文章呢,就一定知道这是一种函数式编程的玩法,也就是用一个高级函数来包装一下。

那多唠叨一句,关于函数式编程呢,我之前还写过一篇文章,叫做函数式编程。

参考资料:https://51gx.top/detail/265那这篇文章呢主要是想通过详细介绍从过程式编程的思维方式,过渡到函数式编程的思维方式,从而带动更多的人玩函数式编程。

所以说如果你想了解一下函数式编程啊,那么呢你可以点击文稿里的链接啊,阅读一下这篇文章。

其实啊构语言的修饰其编程模式,也是函数式编程的模式。

不过呢要提醒你注意的是,构元的糖不多,而且呢又是强烈性的静态无虚拟机的语言。

所以说啊你没有办法做到像java和python那样写出优雅的修饰器的代码。

当然也许是我财出学浅。

那如果你知道更多的写法呢,请你一定要告诉我。

在文稿里呢有一个简单的事例,我们动用了一个高阶函数decorator.在调用的时候呢,先把hello函数传进去,然后呢它会返回一个匿名函数。

那这个匿名函数中啊,除了运行了自己的代码,它也调用了被传入的hello函数。

那这个玩法呢和python很像,只不过有点遗憾。

Go呢并不支持像python那样的decorator与法堂,所以说在调用上有点难看。

当然如果你想让代码更容易读啊,可以用文章里展示的写法。

文章里呢还有一个计算运行时间的例子。

那关于这段代码呢,有几点,我要说明一下。

第一,这里呢有两个sum函数,sum一函数呢就是简单的做个循环,而sum二函数呢动用了数据公式。

第二,在代码中呢使用了构物元的反射机制来获取函数名。

第三,修饰器函数呢是time to some funk.那接下来呢我再给你讲一个处理HTTP请求的相关例子。

我们先看文章里这段简单的HTTP server的代码。

在这段代码中呢使用到了修饰器模式。

With server header函数呢就是一个decorator,它会传入一个HTP handle funk,然后呢返回一个改写的版本儿。

但这个例子呢还是比较简单的,用with server header呢就可以加入一个response header.所以说这样的函数呢,我们可以写出好多有写HTP响应头的,有写认证cookie的,有检查认证cookie的,有打日志的等等。

下面呢我们再说一说多个修饰器的pipeline,前面讲的go修饰器啊,在使用上需要对函数一层一层的套起来,呃,看上去呢好像不是很好看。

那如果需要的修饰器比较多的话呢,代码就会比较难看了。

不过呢我们可以重构一下,在重构的时候呢,我们需要先写一个工具函数,用来便利并调用各个修饰器。

然后呢我们就可以像文章里这样使用了,那这样的代码也更加容易读了,一些pipeline的功能呢也出来了。

不过呢对于go的修饰器模式啊,还有一个小问题,就是好像无法做到泛型。

比如说刚刚那个计算时间的函数,它的代码呢耦合了,需要被修饰函数的接口类型,无法做到非常的通用。

那如果这个问题解决不了,那么这个休日器模式还是有点不好用的。

Go语言它不像python和java, python呢是动态语言,而java有语言虚拟机,所以它们呢可以实现一些比较变态的事儿。

但是呢go语言是一个静态的语言,这就意味着类型需要在编译的时候就搞定,不然的话就无法编译。

不过呢购物员支持的最大的泛型是interface,还有比较简单的reflection机制。

在这上面做一做文章呢,应该还是可以搞定的。

我在文稿里啊分享了我用reflection机制写的一个比较通用的修饰器。

这段代码呢动用了reflect点make fun函数,它创造了一个新的函数。

那其中呢他给的fun点call呢,调用了被修饰的函数。

那关于构元的反射机制啊,你可以阅读一下官方文章。

The loss of reflection.那这里呢我就不多说了。

那这个decorator呢需要两个参数,一个是出参deco pointer啊,就是完成修饰后的函数。

另一个呢是入参function,就是需要修饰的函数。

那这样写是不是有点傻呢?的确是,不过呢这是我个人在购物员里面所能写出来的最好的代码了。

那如果你知道更多优雅的写法,请你一定要告诉我好了,那具体的使用效果是怎么样的呢?首先假设我们有两个需要修饰的函数负五和bar.然后呢,我们可以像文章里这样声明,一个买负函数,然后呢用decorator修饰它。

你会发现使用decorator的时候呢,还需要先声明一个函数签名,感觉好傻一点都不犯醒,不是吗?那如果你不想声明函数签名呢,还可以用另一种方式,就是通过赋值啊,让麦把儿推断出把儿的类型,可能看上去不是那么漂亮。

但是it works啊,听到这儿咱们就可以知道了。

构员目前本身的特性啊,无法做成像java或者python那样。

那对此呢我们只能期待购鱼啊,多放一些糖了。

最后呢我再强调一下,如果你有更好的写法,请你一定要告诉我好了。

这节课呢就到这里。

如果你觉得今天的内容对你所帮助啊,欢迎你帮我分享给更多人。

相关文章:

左耳听风_114_113_Go编程模式修饰器

你好,我是陈浩,我名多尔多house.之前呢我写过一篇文章叫做python修饰器的函数式编程。 那这种模式呢可以很轻松的把一些函数啊装配到另外一些函数上。 让你的代码呢更加简单,也可以让一些小功能性的代码复用性更高。 让代码中的函数呢可以…...

Java实习手册(小白也看得懂)

秃狼说 距离俺发布的学习路线已经六个月了,那我给小伙伴的学习周期是四五个月左右,我相信大多的小伙伴已经学习的差不多了。正好赶上暑期实习的阶段,在暑期找到实习就成为暑期的头等大事。 实习经验在校招的起到决定性的作用,所…...

Elasticsearch 分析器(Analyzer)的作用和配置

在Elasticsearch中,分析器(Analyzer)是文本处理的核心组件,它负责将输入的文本转换为可用于搜索和索引的词项(tokens)。这一过程涉及多个步骤,包括字符过滤、分词和标记过滤,共同决定…...

SpringBoot(一)创建一个简单的SpringBoot工程

Spring框架常用注解简单介绍 SpringMVC常用注解简单介绍 SpringBoot(一)创建一个简单的SpringBoot工程 SpringBoot(二)SpringBoot多环境配置 SpringBoot(三)SpringBoot整合MyBatis SpringBoot(四…...

简述Vue中的数据双向绑定原理

Vue中的数据双向绑定原理是Vue框架的核心特性之一,它通过数据劫持结合发布者-订阅者模式来实现。下面将详细阐述Vue中数据双向绑定的原理,并尽量按照清晰的结构进行归纳: 一、数据劫持 使用Object.defineProperty(): Vue在组件…...

C++STL函数对象的应用

STL函数对象 文章目录 STL函数对象1.基本概念2.使用方法1. 简单函数对象示例2. 函数对象作为算法参数3. Lambda表达式作为函数对象 2.一元谓词和二元谓词1.一元谓词2.二元谓词3.总结 3.算术仿函数1.使用示例2.Lambda表达式的替代 4.关系仿函数5.逻辑仿函数 C中的函数对象&#…...

AJAX-day1:

注:文件布局: 一、AJAX的概念: AJAX是浏览器与服务器进行数据通信的技术 >把数据变活 二、AJAX的使用: 使用axios库,与服务器进行数据通信 基于XMLHttpRequest封装,代码简单 Vue,React项目使用 学习…...

昆虫学(书籍学习资料)

包括昆虫分类(上下册)、昆虫生态大图鉴等书籍资料。...

springboot + mybatis 多数据源切换

参考的b站博主写的 配置文件: spring:datasource:db1:jdbc-url: jdbc:mysql://localhost:3306/interview_database?useUnicodetrue&characterEncodingutf-8&useSSLfalseusername: rootpassword: 12345driver-class-name: com.mysql.cj.jdbc.Driverdb2:jdbc-url: jdbc…...

windows电脑网络重置后wifi列表消失怎么办?

我们的电脑网络偶尔会出现异常,我们通常会下意识选择网络诊断,运行完诊断后一般会让我们选择重置网络,然而,重置后wifi列表突然消失,无法愉快地上网了,找了一圈,都说是更改适配器选项&#xff0…...

Python + 在线 + 文生音,音转文(中文文本转为英文语音,语音转为中文文本)

开源模型 平台:https://huggingface.co/ars-语言转文本: pipeline("automatic-speech-recognition", model"openai/whisper-large-v3", device0 ) hf: https://huggingface.co/openai/whisper-large-v3 github: https://github.com/openai/wh…...

哏号分治,CF103D - Time to Raid Cowavans

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 103D - Time to Raid Cowavans 二、解题报告 1、思路分析 想了半天数据结构最终选择根号分治 我们考虑 大于 550 的公差直接暴力 小于550 的公差的所有询问,我们直接计算该公差后缀和&#xf…...

基于深度学习的图像背景剔除

在过去几年的机器学习领域,我一直想打造真正的机器学习产品。 几个月前,在参加了精彩的 Fast.AI 深度学习课程后,似乎一切皆有可能,我有机会:深度学习技术的进步使许多以前不可能实现的事情成为可能,而且开…...

Python使用(...)连接字符串

Python 字符串连接的灵活性。 使用括号来组织多行字符串时的自动拼接。 e e var_str g*3connect_str (fa{e}bcvar_strh )print(connect_str) print(type(connect_str)) 运行结果&#xff1a; aebcgggh <class str> 解释&#xff1a; 定义变量&#xff1a; e e:…...

鸿蒙:1.入门

概述 简介 鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是华为公司发布的一款智能终端系统&#xff0c;是基于微内核的面向全场景的分布式操作系统。它致力于提供更加安全、高效、低延迟、低功耗的操作体验&#xff0c;可通过技术手段对应用程序和设备进行智能协同&#xf…...

【matlab】智能优化算法——求解目标函数

智能优化算法在求解目标函数方面发挥着重要作用&#xff0c;它通过迭代、筛选等方法来寻找目标函数的最优值&#xff08;极值&#xff09;。以下是关于智能优化算法求解目标函数的详细介绍&#xff1a; 一、智能优化算法概述 智能优化算法是一种搜索算法&#xff0c;旨在通过…...

不改代码,实现web.config或app.config的连接字符串加密解密

目的&#xff1a;加密字符串&#xff0c;防止明文显示。 好处&#xff1a;不用修改代码&#xff0c;微软自带功能&#xff0c;自动解密。 web.config 参考相关文章&#xff1a; Walkthrough: Encrypting Configuration Information Using Protected Configuration | Microso…...

Python创建MySQL数据库

一、使用Docker部署本地MySQL数据库 docker run --restartalways -p 3307:3306 --name mysql -e MYSOL_ROOT_PASSWORDlms123456 -d mysql:8.0.25 参数解析: 用户名:root 密码:lms123456 端口:3307 二、在Pycharm开发工具中配置连接MySQL数据库 三、安装zdppy_mysql pip inst…...

【C++】unordered系列容器的封装

你很自由 充满了无限可能 这是很棒的事 我衷心祈祷你可以相信自己 无悔地燃烧自己的人生 -- 东野圭吾 《解忧杂货店》 unordered系列的封装 1 unordered_map 和 unordered_set2 改造哈希桶2.1 模版参数2.2 加入迭代器 3 上层封装3.1 unordered_set3.2 unordered_map 4 面…...

matlab 超越椭圆函数图像绘制

matlab 超越椭圆函数图像绘制 超越椭圆函数图像绘制xy交叉项引入斜线负向斜线成分正向斜线成分 x^2 y^2 xy 1 &#xff08;负向&#xff09;绘制结果 x^2 y^2 - xy 1 &#xff08;正向&#xff09;绘制结果 超越椭圆函数图像绘制 xy交叉项引入斜线 相对于标准圆&#xf…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...