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的模块。