0
我正在嘗試爲我的包編寫一個測試,並且未能比較funcs。這基本上是我在做什麼。如何比較golang中的funcs
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
@mkb,因爲我很笨哈哈 – David
可能與http://stackoverflow.com/questions/9643205/how-do-i-compare-two-functions-for-pointer-equality-in-the-latest-go - 每週 –