用impl实现type XXX interface {}

impl

介绍

impl generates method stubs for implementing an interface.//impl用于实现生成接口的方法。

安装

准备工作:先检查可能遇到的问题是不是都解决了

安装命令

go get -u github.com/josharian/impl

可能遇到的问题

1、package golang.org/x/tools/imports: unrecognized import path "golang.org/x/tools/imports" (https fetch: Get https://golang.org/x/tools/imports?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)

解决办法

可以用https://github.com/golang/tools上golang的镜像,执行go get github.com/golang/tools或者https://github.com/golang/tools.git下载到本地,然后创建 mkdir -p  golang.org/x/目录,将tools放到golang.org/x/就可以,遇到类似的包找不到都可以用这种方式

使用

例如在toolbox/middleware目录有一个redigo.go文件包含接口如下

type DpRedigoPool interface {

   Close() error

   Err() error

   Do(commandName string, args ...interface{}) (reply interface{}, err error)

   Send(commandName string, args ...interface{}) error

   Flush() error

   Receive() (reply interface{}, err error)

}

在$GOPATH/src目录下就可以通过执行命令

impl 'redigo *RedigoPool' toolbox/middleware.DpRedigoPool

生成如下方法

 

func (redigo *RedigoPool) Close() error {
    panic("not implemented")
}
 
func (redigo *RedigoPool) Err() error {
    panic("not implemented")
}
 
func (redigo *RedigoPool) Do(commandName string, args ...interface{}) (reply interface{}, err error) {
    panic("not implemented")
}
 
func (redigo *RedigoPool) Send(commandName string, args ...interface{}) error {
    panic("not implemented")
}
 
func (redigo *RedigoPool) Flush() error {
    panic("not implemented")
}
 
func (redigo *RedigoPool) Receive() (reply interface{}, err error) {
    panic("not implemented")
}

通过例子,impl的命令格式为:impl  ‘类型名称  *类型'  要实现的接口名称

可以看到impl并没有实现方法的流程,这就可以自己对impl进行修改实现自定义需求

修改impl来自定义接口到方法

impl的代码位置在$GOPATH/src/github.com/josharian/impl/在impl.go文件中有一个常量如下(大约在270行)

const stub = "func ({{.Recv}}) {{.Name}}" +

   "({{range .Params}}{{.Name}} {{.Type}}, {{end}})" +

   "({{range .Res}}{{.Name}} {{.Type}}, {{end}})" +

   "{\n" "panic(\"not implemented\")" "}\n\n"

这个常量就是看到的方法的内容了,我们要做的就是把"panic(\"not implemented\")"替换成自己想要的样子

如果需要传入变化的内容,就可以参照{{.Name}}的方式实现

例如

const stub = "func ({{.Recv}}) {{.Name}}" +
	"({{range .Params}}{{.Name}} {{.Type}}, {{end}})" +
	"({{range .Res}}{{.Name}} {{.Type}}, {{end}})" +
	"{\n" + "startTime := time.Now()" + "\n" +
	"var (" +
	"{{range .Res}}ret{{.Name}} {{.Type}}\n {{end}}" + ")\n" +
	"defer stat.ClientStat(stat.GetMetrics(stat.MetricsResult(stat.GetResult(" +
	"{{range .Res}}ret{{.Name}},  {{end}}" +
	")), stat.MetricsDest(rc.opt.addr), stat.MetricsStart(startTime)))" +
	"\n" +
	"str:=\"{{range .Res}}ret{{.Name}}, {{end}}ext=\"\n" +
	"rc.Client.{{.Name}}(" +
	"{{range .Params}}{{.Name}}, {{end}}" +
	")" +
	"\n" + "return " +
	"{{range .Res}}ret{{.Name}},  {{end}}ext" +
	"}\n\n"

然后go install

后:impl 'rc *RedisClient' toolbox/middleware.DpRedisClient

执行出来的记过如下:

func (rc *RedisClient) Pipelined(fn func(redis.Pipeliner) error) ([]redis.Cmder, error) {
	startTime := time.Now()
	var (
		ret []redis.Cmder
		ret error
	)
	defer stat.ClientStat(stat.GetMetrics(stat.MetricsResult(stat.GetResult(ret, ret)), stat.MetricsDest(rc.opt.addr), stat.MetricsStart(startTime)))
	str := "ret, ret, ext="
	rc.Client.Pipelined(fn)
	return ret, ret, ext
}

还需要在进行查找替换进行进一步修改,但是相对于每个方法都实现已经节省了很多的时间了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值