【发布时间】:2015-04-29 02:59:58
【问题描述】:
我正在尝试为我的包编写一个测试,但在比较函数时失败了。这基本上就是我正在做的事情。
package main
import (
"fmt"
"reflect"
)
type HandlerFunc func(cmd interface{})
type Bus struct {
handlers map[reflect.Type]HandlerFunc
}
func (bus *Bus) RegisterHandler(cmd interface{}, handler HandlerFunc) {
bus.handlers[reflect.TypeOf(cmd)] = handler
}
func (bus *Bus) GetHandler(cmd interface{}) HandlerFunc {
t := reflect.TypeOf(cmd)
for kind, handler := range bus.handlers {
if t == kind {
return handler
}
}
return nil
}
func New() *Bus {
return &Bus{
handlers: make(map[reflect.Type]HandlerFunc),
}
}
type RegisterUserCommand struct {}
func main() {
bus := New()
handler := func (cmd interface{}) {}
bus.RegisterHandler(&RegisterUserCommand{}, handler)
retrieved := bus.GetHandler(&RegisterUserCommand{})
if retrieved != handler {
fmt.Println("Not the same!")
return
}
fmt.Println("Same!")
}
将retrieved 与handler 比较会导致以下错误
invalid operation: (func(interface {}))(retrieved) != handler (func can only be compared to nil)
如何正确测试我正在检索的函数是否与之前添加的函数相同?
【问题讨论】:
-
这不是您实际问题的答案,但您为什么要遍历
GetHandler中的类型映射到处理程序?您可以返回bus.handlers[t],这将为未定义的处理程序返回nil。 -
@mkb 因为我很笨哈哈
标签: go