我是新手,并且在使用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接口并在上面的示例中进行单元测试传递?
答案 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())
}