原创: 张晓龙

前言

说起拦截器,大家一定会想起Java语言。

Java里的拦截器是动态拦截Action调用的对象,它提供了一种机制使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。

最近一段时间,笔者想在Golang代码里面使用拦截器,但在github上却没有找到相关的库,于是就有了自己实现一个拦截器的想法。

Golang没有虚拟机,对反射的支持比Java弱很多,所以不能照搬java的实现方式。就在笔者决定彻底放弃使用动态代理实现拦截器时,突然来了灵感,并且一口气完成了实现。

本文结合代码介绍Golang拦截器的一种实现,希望能给现在或将来想用拦截器的Gopher一些思路。

产品代码

我们简单模拟一下产品代码:

  • 有一个Account接口,声明了方法Query和Update,分别用于查询帐户和更新帐户
  • 类AccountImpl实现了Account接口
  • 有一个简单工厂New,用于创建一个Account对象

代码如下所示:

我们写一个main函数:

运行程序:

静态代理

静态代理的类图很简单,如下所示:

我们在产品代码之外实现一下Proxy,如下所示:

Account对象跳转到Proxy

若要将Account对象从AccountImpl跳转到Proxy,则需要使用Monkey框架的Patch接口。

我们在Proxy所在的文件中增加init函数来完成跳转:

注:因为该代码不是测试代码,所以我们在import monkey时,没有在前面加点号"."。

在main函数所在文件的import语句中增加一行代码(第二行):

运行程序:

和期望不符,难道是Monkey的Patch没有生效吗?

回顾上一篇文章《Monkey框架使用指南》,Monkey有inline函数的缺陷,我们的解决方案是通过命令行参数-gcflags=-l禁止inline。

重新运行程序:

OK!完全符合期望,而且拦截器对产品代码零入寝,仅需在main函数所在文件的import语句中增加一行代码。

小结

本文结合代码给出了Golang拦截器的一种实现,即“静态代理模式 + Monkey框架”。从过程中可以看出,要拦截的方法必须是接口声明的,而且有一个简单工厂用于创建该接口的对象。

说明:对于不满足本方法约束的框架,如果想对其入口出口消息进行拦截,则需要具体问题具体分析,比如Beego框架可以借助filter功能来实现拦截器。

golang protobuf 动态消息获取_干货|Golang拦截器的一种实现相关推荐

  1. spring 两次进入拦截器_过滤器和拦截器的 6 个区别,别再傻傻分不清了

    点击上方 肉眼品世界,选择 设为星标 深度价值体系传递 作者 :程序员内点事 来源 :toutiao.com/i6834310440495874563 毕竟这两种工具开发中用到的频率都相当高,应用起来 ...

  2. list mybatis 接收 类型_基于mybatis拦截器实现的一款简易影子表自动切换插件

    近期因工作需要,小编基于mybatis拦截器开发了一款简易影子表自动切换插件,可以根据配置实现动态修改表名,即将对原source table表的操作自动切换到对target table表的操作.该插件 ...

  3. 拦截器获取请求参数post_SpringBoot拦截器如何获取http请求参数

    1.1.获取http请求参数是一种刚需 我想有的小伙伴肯定有过获取http请求的需要,比如想 前置获取参数,统计请求数据 做服务的接口签名校验 敏感接口监控日志 敏感接口防重复提交 等等各式各样的场景 ...

  4. java怎么拦截数据库查询结果_关于mybatis拦截器,有谁知道怎么对结果集进行拦截,将指定字段查询结果进行格式化...

    用MyBatis结果集拦截器做过这样一个需求: 由于项目需求经常变动,项目MySQL数据库都是存放JSON字符串,例如:用户的基本信息随着版本升级可能会有变动 数据表 CREATE TABLE `ac ...

  5. golang mysql连接池原理_[Go] golang实现mysql连接池

    golang中连接mysql数据库,需要使用一个第三方类库github.com/go-sql-driver/mysql,在这个类库中就实现了mysql的连接池,并且只需要设置两个参数就可以实现 一般连 ...

  6. golang调用java的函数_大话golang性能分析(一):profile基本原理

    引言:好久没分享了,不多废话了,准备一个专题分三期来分享下golang的性能分析. O 专题目标 理解profile基本原理 熟悉go常用性能分析工具pprof 快速对线上服务的cpu.内存.goro ...

  7. golang http 返回html文件_用Golang写爬虫(三) - 使用goquery

    原文地址: https://strconv.com/posts/web-crawler-exercise-3/ 在写爬虫的时候,想要对HTML内容进行选择和查找匹配时通常是不直接写正则表达式的:因为正 ...

  8. 动态后台获取_后台管理系统的权限以及vue处理权限的思路

    一般来说,在(后台)管理系统(最早的企业级的项目和网站的后台管理系统现在大部分人都叫后台管理系统)中才会有权限之说.权限分为功能级权限和数据级权限.这篇文章主要谈论功能级权限. 一.名词解释: 权限的 ...

  9. golang import中的.和_的使用,import的几种方式点,下划线,别名

    别看这个文章很短,解决的问题却很重要. . 是调用的时候省略包的前缀 _ 是指调用其init()函数 别名就是起个简单名字 func的大小写 同一个package里面 不同package里面 例如首字 ...

  10. Golang能取代Java吗_为什么Golang能从Java和C++嘴里抢来一块蛋糕

    不得不说go的市场切入点非常准确 go被设计出来的目标应用场景是服务器开发,而服务器端开发是c++和java的地盘,占了大部分份额,go的目标是从他们嘴里抢蛋糕 程序员选语言除了流行度以外,语言是否好 ...

最新文章

  1. docker存储结构解析
  2. React学习笔记(持续更新)
  3. python 的__str__和__repr__有什么区别?
  4. android画板的实验报告,android实验报告模板_实验一
  5. PremierePR2019CC Beat Edit 安装好之后打不开?Pr下载模板安装后不能使用?Pr全屏预览?此效果需要GPU加速?小清新lut?
  6. 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
  7. C语言 java 判断闰年,一个月有多少天
  8. hmmlearn源代码
  9. java百度天气接口解析_Java调用天气接口(百度天气)解析返回的JSON数据
  10. Java应用性能分析工具:async-profiler
  11. 原厂对NPI安全稽核要求
  12. DS_Store是什么?
  13. JAVA毕设项目九宫格日志网站(java+VUE+Mybatis+Maven+Mysql)
  14. ODI(Oracle Data Integrator)基本使用教程(1)
  15. 备考PMP的程序员注意了!!!13张PMPBook思维导图免费送上,没有套路,直接领取
  16. 2.6 人工智能组件
  17. 软件测试的底层逻辑思维是什么?
  18. python学习第二天
  19. 关于pdfobject.js在不同浏览器显示问题
  20. C语言编程图书销售系统,C语言图书销售的管理系统.doc

热门文章

  1. 从LR到DNN点击率预估
  2. UItabelView头部视图;
  3. idea ****.class拒绝访问
  4. 50个技巧提高你的PHP网站程序执行效率
  5. 大学生必看的一分钟——俞洪敏语录
  6. Sentry的安装搭建与使用
  7. IDEA 工具从Json自动生成JavaBean
  8. Zabbix 3.4.2 install Configuration
  9. Python_代码练习_写一个判断是否为小数的函数
  10. hdu 1983(BFS+DFS) 怪盗Kid