当前位置: 首页 > 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…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 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&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;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...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...

高分辨率图像合成归一化流扩展

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