go - 如何使用多个方法将中间件写入接口?
问题描述
我得到了一个具有不止一种方法的界面。我想知道如何为它编写一个中间件。
我在谷歌中寻找,但发现所有答案都是针对只有一种方法的接口。我没有发现任何问题。我尝试编写一个演示,但它不起作用。
package main
import (
"fmt"
"strconv"
)
type ti interface {
Say(int) string
Eat(string) int
}
type Middleware func(ti) ti
func GetMiddleWare(t ti) ti {
var tm ti
t.Say = func(i int) string {
fmt.Println("arg is " + strconv.Itoa(i))
var ret string
defer func() {
fmt.Println("ret is " + ret)
}()
ret = t.Say(i)
return ret
}
t.Eat = func(s string) int {
fmt.Println("arg is " + s)
var ret int
defer func() {
fmt.Println("ret is " + strconv.Itoa(ret))
}()
ret = t.Eat(s)
return ret
}
return tm
}
这没用
.\main.go:17:8: cannot assign to t.Say
.\main.go:26:8: cannot assign to t.Eat
那么,如何为具有多个方法的接口编写中间件呢?
解决方案
定义一个包装值的类型。在该类型上实现接口方法。
// Middleware wraps the value t with logging.
type Middleware struct {
t ti
}
func (m Middleware) Say(i int) string {
fmt.Println("arg is " + strconv.Itoa(i))
var ret string
defer func() {
fmt.Println("ret is " + ret)
}()
ret = m.t.Say(i)
return ret
}
func (m Middleware) Eat(s string) int {
fmt.Println("arg is " + s)
var ret int
defer func() {
fmt.Println("ret is " + strconv.Itoa(ret))
}()
ret = m.t.Eat(s)
return ret
}
func GetMiddleWare(t ti) ti {
return Middleware{t}
}
推荐阅读
- javascript - 在新的 AngularFire 7 (Firebase 9) 中实现云函数时出现未知语法错误
- ansible - 如果已创建 VM,Ansible vmware_guest customize_spec 不会更改任何内容
- python - 如何使具有多个答案的问题/答案成为可能
- python-3.x - Spacy 在 Pardo 中中断序列化 - Apache Beam
- powershell - 提示时如何将参数作为输入传递给powershell脚本?
- sqlite - 如何强制 nHibernate 自动更新引用对象?
- jupyter-notebook - 用于情节热图的交互式 zmax?
- javascript - 如何存储多个复选框的变量以供以后在同一网页上使用?
- javascript - 不同类型的位置固定但结果相同
- javascript - 我可以通过 javascript 获取背景图像源的大小吗?