【发布时间】:2021-10-13 14:56:50
【问题描述】:
所以据我了解,为了在 Go 中实现多态性,我们希望在接口实现期间利用类型接收器并使用它的值。
在这种情况下,我们应该在接口实现期间何时使用方法参数而不是接收器?从我的角度来看,制作具有严格/大量签名的界面会使界面变得不那么有用。
假设我有这个结构、接口和实现
type BankAccount struct {
UserId uint64,
AccountName string,
BankName string
}
type IBankAccount interface {
CheckBankAccount()
}
func (b *BankAccount) CheckBankAccount() {
// do something that require b.UserId, b.AccountName and b.BankName
}
//we call it like this
b:= BankAccount{UserId: 1, AccountName: "123", BankName: "some-bank"}
b.CheckBankAccount()
比这个好吗?
type BankAccount struct {}
type IBankAccount interface {
CheckBankAccount(userId uint64, accountName string, bankName string)
}
func (b *BankAccount) CheckBankAccount(userId uint64, accountName string, bankName string) {
// do something that require userid accountname and bank name
}
//calling
b:= BankAccount{}
b.CheckBankAccount(1, "123", "some-bank")
但看起来像第二个例子,接口实现更像普通函数(?)
另一方面,第一个示例似乎隐藏了很多细节,并要求未来的代码阅读器读取实现中使用的参数。这是抽象应该是什么还是我误解了这个概念?
【问题讨论】:
-
第一个接口作为接口基本没用。
-
这是否意味着我们应该平衡利用接收者和参数的价值?与第二个示例一样,但在结构中使用 BankName(例如)? @HymnsForDisco
-
可能你误解了struct和interface的关系。接口的目的是通过一组方法描述一个完整的、有用的行为。这就是为什么第一个“几乎没用”的原因。唯一的方法不带参数,也不返回任何值。从实际的角度来看,在不获取或不产生任何数据的情况下,尚不清楚如何完整且有效地描述“回溯帐户”的概念。
-
这可能是我的一个小问题,但这可能是一个“泡沫包装”的例子,其中具体的数据类型被不必要/过早的接口所掩盖,导致复杂的实现和抽象stackoverflow.com/a/67133656/11424673跨度>
-
哦,抱歉,不返回值完全是我的坏事。忘记放了,因为它来自实际项目,所以必须删除一些东西。 CheckBankAccount 将返回包含有关银行帐户是否可用的帐户详细信息的结构。