繁体   English   中英

Go 使用 struct 作为接口而不实现所有方法

[英]Go use struct as interface without implementing all methods

例如,我有 20 种方法的 dao。

type UserDao interface {
    GetUser() (User, error)
    GetUsers() ([]User, error)
    ...
}

我想为测试创建模拟并且只使用一种方法。

type UserDaoMock struct { }

fucn (UserDaoMock) GetUser() (User, error) {
    return User{}
}

有没有办法在测试中使用 UserDaoMock 作为 UserDao 之前不实现其他方法? 告诉编译器它应该是这样的吗?

UserDao接口嵌入到您的模拟结构中,因此它将提升所有方法。 仅实现您需要的方法(实际调用的方法):

type UserDao interface {
    GetUser() (User, error)
    GetUsers() ([]User, error)
}

type UserDaoMock struct {
    UserDao
}

func (UserDaoMock) GetUser() (User, error) {
    return User{}, nil
}

测试它:

var dao UserDao
dao = UserDaoMock{}
fmt.Println(dao.GetUser())

哪个会输出(在Go Playground上试试):

{} <nil>

请注意,调用任何其他方法当然会恐慌,因为嵌入的UserDao字段是nil ,所以它们背后没有真正的实现。 但是UserDaoMock确实实现UserDao ,并且GetUser()方法已经实现并且是可调用的。

请参阅相关问题以检测哪些方法是可调用的: Go reflection with interface embedded in struct - how to detect "real" functions?

其他相关问题:

是否可以在 Go 中定义匿名接口实现?

Go 中嵌入式私有接口的可见性

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM