搜索
简帛阁>技术文章>go:快速添加接口方法及其实现

go:快速添加接口方法及其实现

问题描述

在大型项目中,通常存在多个模块,模块对外暴露的功能通常是通过接口封装,这样可以明确模块的功能,有效降低模块与模块之间的耦合度,同时模块与模块之间进行合理的组装。接口的实现,有时可能存在多个实现,如接口每个实现对应一种策略、或者测试代码中因为测试场景添加了测试实现等,这时候如果想给接口添加一个方法,自然需要给所有的实现都添加这个方法。但是当你给接口添加了一个方法后,这时候之前接口的实现就无法通过idea找到了。或许,先给所有的实现添加方法,最后在给接口添加。

灵感

文章:http://oopsguy.com/2017/10/27/the-ultimate-guide-to-writing-a-go-tool/
项目:https://github.com/fatih/gomodifytags

这个主要是功能是,获取一个go文件中sruct的定义,然后给其每个字段添加tag,核心使用了go中的ast去解析go文件,生成相应代码。

解决方案

实现的预期效果,给指定接口的方法,然后给齐所有的实现也添加上这个方法的默认实现。

思路

  • 扫描项目中所有的struct和interface
  • 判断所有的struct与interface组合是否存在实现关系
  • 通过ast给interface与struct添加方法

效果

源码
https://github.com/SimFG/interfacer

PS:目前的实现是最初版,只是可以满足基本的情况,对于代码中的一些特殊结构欠缺考虑,如果使用过程中发现问题,欢迎github上反馈

问题描述在大型项目中,通常存在多个模块,模块对外暴露的功能通常是通过接口封装,这样可以明确模块的功能,有效降低模块与模块之间的耦合度,同时模块与模块之间进行合理的组装。接口实现,有时可能存在多个实现
快速排序是一种基于分治技术的重要排序算法。不像归并排序是按照元素在数组中的位置对它们进行划分,快速排序按照元素的值对它们进行划分。具体来说,它对给定数组中的元素进行重新排列,以得到一个快速排序的分区。
目的在刷算法题中经常遇到关于链表的操作,在使用go语言去操作链表时不熟悉其实现原理,目的是为了重温链表这一基础且关键的数据结构。1、链表的特点和初始化11、链表的特点用一组任意的存储单元存储线性表的数
本文实例讲述了Go语言中接口组合的实现方法。分享给大家供大家参考。具体实现方法如下:在Go语言中,可以在接口A中组合其它的一个或多个接口(如接口B、C),这种方式等价于在接口A中添加接口B、C中声明的
方法与指针重定向带指针参数的函数必须接受一个指针:funcScaleFunc(v*Vertex,ffloat64){vX=vX*fvY=vY*f}以指针为接收者的方法被调用时,接收者既能为值又能为指
本文实例讲述了Go语言实现冒泡排序、选择排序、快速排序及插入排序的方法。分享给大家供大家参考。具体分析如下:算法是程序的灵魂,而排序算法则是一种最基本的算法。排序算法有许多种,这里介绍4中排序算法:冒
在介绍List接口之前,我们先来看看Collection接口,因为Collection接口是List/Set/Queue接口的父接口,List/Set/Queue的实现类中很多的操作方法其实还是调用
一句话总结:如果接口A实现接口B中所有方法,那么A可以转化为B接口。packageoptionstypeIPeopleinterface{GetName()string}typeIPeople2in
接口类型变量Go是强类型语言,你不能将整数值赋值给浮点型变量。同样,也不能将没有实现接口的类型值赋值给接口类型变量。//1定义变量是接口类型varwioWriter//2将具体类型的值赋值给这个变量,
接口声明//接口声明语法:接口是一个函数签名的集合,函数签名(函数的声明,不包括实现)typeinterfaceNameinterface{method1(paramparamType,parampa