用go语言与getter和setter接口

时间:2017-03-09 17:47:23

标签: go

我是新手,并且在使用getter和setter从不同文件指定结构的接口时遇到问题。

来源

的src / github.com /用户/接口

package interfaces

type IFoo interface {
    Name() string
    SetName(name string)
}

的src / github.com /用户/富

package foo

import "github.com/user/interfaces"

type Foo struct {
    name string
}

func (f *interfaces.IFoo) SetName(name string) {
    f.name = name
}

func (f IFoo) Name() string {
    return f.name
}

如果我将struct Foo的方法签名更改为以下内容,则import "github.com/user/interfaces"将变为未使用。

func (f *Foo) SetName(name string) {
    f.name = name
}

func (f Foo) Name() string {
    return f.name
}

测试

test/github.com/user/foo/foo_test.go

package foo

import (
    "testing"
    "github.com/user/foo"
    "fmt"
    "github.com/user/interfaces"
)

func TestFoo(t *testing.T) {
    foo := foo.Foo{}

    fmt.Println(interfaces.IFoo(foo))
}

问题:如何指定Foo结构的IFoo接口并在上面的示例中进行单元测试传递?

1 个答案:

答案 0 :(得分:4)

  

如何指定Foo结构的IFoo接口

你没有。在Go中,接口实现是隐式的。请参阅https://tour.golang.org/methods/10

也就是说,如果Foo实现了IFoo接口的所有方法,它就实现了接口。你不需要“告诉”结构它是一个IFoo。

你所要做的就是

func (f *Foo) SetName(name string) {
    f.name = name
}

func (f Foo) Name() string {
    return f.name
}

然后在你的测试中你可以做到:

test/github.com/user/foo/foo_test.go

package foo

import (
    "testing"
    "fmt"
    "github.com/user/interfaces"
)

func TestFoo(t *testing.T) {
    var foo interfaces.IFoo = &Foo{}
    foo.SetName("bar")
    fmt.Println(foo.Name())
}

编辑:您的测试文件应与其正在测试的文件位于同一文件夹中,您不应将它们全部放在test文件夹中。话虽这么说,如果你想保持结构相同,你需要确保你的包名foo不被你的变量名foo覆盖,然后加上前缀Foo{}foo

test/github.com/user/foo/foo_test.go

package foo

import (
    "testing"
    "fmt"
    "github.com/user/interfaces"
    "github.com/user/foo"
)

func TestFoo(t *testing.T) {
    var f interfaces.IFoo = &foo.Foo{}
    f.SetName("bar")
    fmt.Println(f.Name())
}