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文件包含接口如下
|
在$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行)
|
这个常量就是看到的方法的内容了,我们要做的就是把"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
}
还需要在进行查找替换进行进一步修改,但是相对于每个方法都实现已经节省了很多的时间了