左耳听风_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交叉项引入斜线 相对于标准圆…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...

高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...