Methods 函数内部结构的定义方法

Methods 函数内部结构的定义方法,methods,struct,go,dependency-injection,Methods,Struct,Go,Dependency Injection,我有这个密码 func baz() { type mockDatabase struct{} // // More code // } 我想定义mockDatabase的方法,因此完整代码如下所示: func baz() { type mockDatabase struct{} func (m *mockDatabase) Foo() { // Implement function here } //

我有这个密码

func baz() {
    type mockDatabase struct{}

    //
    //  More code
    //
}
我想定义
mockDatabase
的方法,因此完整代码如下所示:

func baz() {
    type mockDatabase struct{}

    func (m *mockDatabase) Foo() {
        // Implement function here
    }

    //
    //  More code
    //
}
我之所以要这样做,是因为我正在向函数中注入依赖项,我想创建一个“mock对象”来注入函数(函数将接口作为参数,mock对象将实现接口)


我可以在外部创建结构,但在本地声明结构以减少命名空间混乱似乎更符合逻辑,尤其是当这些模拟对象只使用一次时。我是不是遗漏了什么?在测试函数之外定义它,这样它就不长了,这是更好的做法吗?我应该在这里做什么?

惯用的Go是使用package进行名称空间

package mock 

type MockDatabase struct {}

func (m *mockDatabase) Foo() {}
在主代码中,您可以从包中调用

package main

import (
        "path/to/mock"
)

var m = New(mock.MockDatabase)

func baz() {
        m.Foo()
}

直接-不。老实说,我认为派-欧-帕回答了你的问题但是。如果出于某种原因,您仍然想按照自己的方式来做,您可以使用一点样板包装和巧妙地使用闭包:

type I interface {
    Foo()
}

type ExtendableI struct {
    foo func()
}

func (i ExtendableI) Foo() {
    i.foo()
}

func main() {
    type MyI int
    myI := MyI(42)
    foo := func() {
        fmt.Println(myI) // Close over myI making it work like a method.
    }
    ei := ExtendableI{foo: foo}
    useI(ei) // useI needs an I.
}

游乐场:。

如果它实际上是测试代码,那么就不会出现名称空间混乱的情况。如果你还担心的话,pie-o-pah的答案看起来还不错。看起来你对javascript的注入模式很熟悉。在Go中,管理依赖关系更类似于Python的模块。