【问题标题】:how to compare funcs in golang如何比较golang中的函数
【发布时间】: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!")
}

retrievedhandler 比较会导致以下错误

invalid operation: (func(interface {}))(retrieved) != handler (func can only be compared to nil)

如何正确测试我正在检索的函数是否与之前添加的函数相同?

【问题讨论】:

  • 这不是您实际问题的答案,但您为什么要遍历GetHandler 中的类型映射到处理程序?您可以返回bus.handlers[t],这将为未定义的处理程序返回nil
  • @mkb 因为我很笨哈哈

标签: go


【解决方案1】:

鉴于您无法比较函数,您可以用不同的方式编写测试。您可以让handler 在您的测试中设置一个布尔值,并通过调用它并查看布尔值是否发生变化来检查您是否获得了正确的函数。

这是一个例子:

func main() {
    bus := New()
    called := false
    handler := func (cmd interface{}) { called = true }

    bus.RegisterHandler(&RegisterUserCommand{}, handler)
    bus.GetHandler(&RegisterUserCommand{})(nil)

    if called {
        fmt.Println("We got the right handler!")
        return
    }

    fmt.Println("We didn't get the right handler")
}

【讨论】:

    猜你喜欢
    • 2017-10-11
    • 2016-04-05
    • 2016-03-26
    • 1970-01-01
    • 2022-01-24
    • 2018-05-22
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多