左耳听风_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那样。

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

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

这节课呢就到这里。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/774777.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024骨传导耳机品牌排行榜!盘点10款优质热门机型推荐!

骨传导耳机逐渐成为当下最受欢迎的热门机型,但随着耳机热度的增高,市面上一些不法商家仿佛看到了商机,纷纷投入骨传导耳机市场,这也导致骨传导耳机市场出现鱼龙混杂,劣质品牌横行的局面,纷纷有消费者反馈说…

android2024 gradle8 Processor和ksp两种编译时注解实现

android的编译时注解,老生常谈,外面的例子都是bindView,脑壳看疼了,自己学习和编写下。 而且现在已经进化到kotlin2.0了,google也逐渐放弃kapt,进入维护状态。所以要好好看看本贴。 参考我的工程&#xff1…

djangoGD高校信管专业就业信息管理系统-计算机毕业设计源码59343

djangoGD高校信管专业就业信息管理系统 摘 要 随着高校信管专业的快速发展,学生就业问题日益受到广泛关注。为了更好地服务学生,提高就业率,许多高校开始引入信息化手段来管理学生就业信息。然而,传统的就业信息管理方式存在很多问…

Linux关于文件的高级命令

tree命令 tree命令用于以树状图的形式显示目录结构。它可以帮助用户快速了解目录和文件的层次关系,非常适合用于浏览和理解大型文件系统的结构。 基础用法 显示当前目录的树状结构:tree 显示指定目录的树状结构:tree 指定目录路径 tree命…

【C++】 解决 C++ 语言报错:Segmentation Fault

文章目录 引言 段错误(Segmentation Fault)是 C 编程中常见且令人头疼的错误之一。段错误通常发生在程序试图访问未被允许的内存区域时,导致程序崩溃。本文将深入探讨段错误的产生原因、检测方法及其预防和解决方案,帮助开发者在…

昇思25天学习打卡营第5天 | 神经网络构建

1. 神经网络构建 神经网络模型是由神经网络层和Tensor操作构成的,mindspore.nn提供了常见神经网络层的实现,在MindSpore中,Cell类是构建所有网络的基类,也是网络的基本单元。一个神经网络模型表示为一个Cell,它由不同…

如何摆脱反爬虫机制?

在网站设计时,为了保证服务器的稳定运行,防止非法数据访问,通常会引入反爬虫机制。一般来说,网站的反爬虫机制包括以下几种: 1. CAPTCHA:网站可能会向用户显示CAPTCHA,要求他们在访问网站或执行…

Netty学习(Netty入门)

概述 Netty是什么 Netty的地位 Netty的优势 HelloWorld public class HelloClient {public static void main(String[] args) throws InterruptedException {// 1. 启动类new Bootstrap()// 2. 添加 EventLoop.group(new NioEventLoopGroup())// 3. 选择客户端 channel 实现.…

python绘制领域矩形

问题描述: 使用python书写代码实现以下功能:给定四个点的坐标,调用一个函数,可以使原来的四个点分别向四周上下左右移动15距离,分别记录下移动后的坐标,然后画出内侧矩形和外侧矩形 代码: im…

配置并调试后端程序(sql)

1.环境准备 安装VS Code和Node.js插件:确保你已经安装了VS Code和Node.js插件。创建launch.json文件:在你的项目中创建一个.vscode文件夹,并在其中创建launch.json文件。添加以下内容: {"version": "0.2.0"…

【C语言】五子棋(c语言实现)

这里写目录标题 最终效果菜单打印函数棋盘的初始化和打印人人对战落子判空函数悔棋函数判胜负函数人人对战 人机对战一是将直接调用rand生成随机值,这就不可控二是根据棋子赢面来判断哪里落子最好 如果选择退出程序直接exit就行主函数调用逻辑源代码 最终效果 五子棋…

The Sandbox 人物化身每月奖励: 七月版来了!

人物化身的持有者可以从 The Sandbox 领取自己的队服! 视频:https://youtu.be/tSo5FPL7DhE 我们又推出了人物化身所有者月度奖励!在七月,我们将通过 The Sandbox 队服来弘扬体育竞技精神。穿上这些时尚的元宇宙队服,代…

深度报告 | 百度安全携手极越安全发布《整车安全渗透测试白皮书》

注重点,如何确保车辆全生命周期的安全已成为整个行业亟待解决的问题。对于车企而言,通过渗透测试尽量多地发现安全威胁,是确保车辆信息系统的稳定运行、保障用户安全驾驶至关重要的措施。然而,传统的渗透测试方法已无法满足智能网…

Linux miniconda 安装tensorflow-gpu遇到找不到GPU问题

背景: Linux Miniconda python3.9 安装步骤 1、 pip install tensorflow-gpu2.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple 2、报错如下: 更换镜像源,单独安装 pip install tf-estimator-nightly2.8.0.dev2021122109 -i https:/…

使用 docker buildx 构建跨平台镜像

buildx是Docker官方提供的一个构建工具,它可以帮助用户快速、高效地构建Docker镜像,并支持多种平台的构建。使用buildx,用户可以在单个命令中构建多种架构的镜像,例如x86和arm架构,而无需手工操作多个构建命令。此外bu…

【docker】容器内配置环境变量

背景: 我要把下面的环境变量写到bash脚本里,起名叫environment_start.sh。 目的: 用于每次进入容器dev_into.sh的时候,让系统获取到环境变量。 操作步骤: 先在容器外找个合适的位置写环境变量bash脚本&#xff0c…

bmob Harmony鸿蒙快速开发搜索功能

搜索功能是很多应用都需要的功能。在很多平台上,要开发一个兼容性较好的搜索功能都还是需要添加比较多的视图代码的。 为了解决这个问题,鸿蒙ArkUI提供了一个快速添加搜索功能的视图组件给我们,结合Bmob Harmony鸿蒙SDK的搜索能力&#xff0…

四款主流电脑监控软件(电脑监控软件主要优势)

在现代企业环境中,确保员工的工作效率和企业信息的安全成为了管理者的重要任务。电脑监控软件作为一种有效的管理工具,能够帮助企业实现这些目标。固信电脑监控软件在这方面表现尤为出色,本文将详细介绍固信电脑监控软件的优势及其主要功能&a…

【C++】 解决 C++ 语言报错:Use of Uninitialized Variable

文章目录 引言 使用未初始化的变量(Use of Uninitialized Variable)是 C 编程中常见且危险的错误之一。它通常在程序试图使用尚未赋值的变量时发生,导致程序行为不可预测,可能引发运行时错误、数据损坏,甚至安全漏洞。…

基于芯片CSU8RP1382开发的咖啡秤方案

咖啡电子秤芯片方案精确值可做到分度值0.1g的精准称重,并带有过载提示、自动归零、去皮称重、压低报警等功能,工作电压在2.4V~3.6V之间,满足于咖啡电子秤的电压使用。同时咖啡电子秤PCBA设计可支持四个单位显示,分别为:g、lb、oz、…