用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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值