2015-08-15 58 views
3

结构的方法,我有这样的代码定义内部功能

func baz() { 
    type mockDatabase struct{} 

    // 
    // More code 
    // 
} 

我想定义的mockDatabase的方法,所以完整的代码应该是这样的:

func baz() { 
    type mockDatabase struct{} 

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

    // 
    // More code 
    // 
} 

我想原因做到这一点是我注入到一个函数的依赖,我想创建一个“模拟对象”注入到该函数(函数接口作为参数,模拟对象将实现接口)。

我之外创建的结构,但它似乎更符合逻辑本地声明结构来减少杂乱的命名空间,尤其是当这些模拟对象将只使用一次。我在这里错过了什么吗?在测试功能之外定义它是否更好,因此时间不长?我应该在这里做什么?

+0

如果它实际上是测试代码,那么确实没有名称空间混乱发生。如果你仍然担心这个问题,pie-o-pah的回答看起来并不糟糕。 – THUNDERGROOVE

+0

似乎你很熟悉JavaScript的注入模式。在Go中,管理依赖关系更类似于Python的模块。 – PieOhPah

回答

4

惯用围棋是使用的命名空间。

package mock 

type MockDatabase struct {} 

func (m *mockDatabase) Foo() {} 

在主代码,你可以从包

package main 

import (
     "path/to/mock" 
) 

var m = New(mock.MockDatabase) 

func baz() { 
     m.Foo() 
} 
2

直接拨打 - 没有。说实话,我认为馅饼派对回答了你的问题。 但是。如果你仍然想出于某种原因做你的方式,你可以用样板包装的一点点,巧妙地利用倒闭的做到这一点:

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. 
} 

游乐场:http://play.golang.org/p/G2HKhjb5fk