左耳听风_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列表突然消失,无法愉快地上网了,找了一圈,都说是更改适配器选项࿰…...
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 的公差的所有询问,我们直接计算该公差后缀和…...
基于深度学习的图像背景剔除
在过去几年的机器学习领域,我一直想打造真正的机器学习产品。 几个月前,在参加了精彩的 Fast.AI 深度学习课程后,似乎一切皆有可能,我有机会:深度学习技术的进步使许多以前不可能实现的事情成为可能,而且开…...
Python使用(...)连接字符串
Python 字符串连接的灵活性。 使用括号来组织多行字符串时的自动拼接。 e e var_str g*3connect_str (fa{e}bcvar_strh )print(connect_str) print(type(connect_str)) 运行结果: aebcgggh <class str> 解释: 定义变量: e e:…...
鸿蒙:1.入门
概述 简介 鸿蒙操作系统(HarmonyOS)是华为公司发布的一款智能终端系统,是基于微内核的面向全场景的分布式操作系统。它致力于提供更加安全、高效、低延迟、低功耗的操作体验,可通过技术手段对应用程序和设备进行智能协同…...
【matlab】智能优化算法——求解目标函数
智能优化算法在求解目标函数方面发挥着重要作用,它通过迭代、筛选等方法来寻找目标函数的最优值(极值)。以下是关于智能优化算法求解目标函数的详细介绍: 一、智能优化算法概述 智能优化算法是一种搜索算法,旨在通过…...
不改代码,实现web.config或app.config的连接字符串加密解密
目的:加密字符串,防止明文显示。 好处:不用修改代码,微软自带功能,自动解密。 web.config 参考相关文章: 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 (负向)绘制结果 x^2 y^2 - xy 1 (正向)绘制结果 超越椭圆函数图像绘制 xy交叉项引入斜线 相对于标准圆…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
边缘计算网关提升水产养殖尾水处理的远程运维效率
一、项目背景 随着水产养殖行业的快速发展,养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下,而且难以实现精准监控和管理。为了提升尾水处理的效果和效率,同时降低人力成本,某大型水产养殖企业决定…...
