【发布时间】:2020-06-23 11:58:26
【问题描述】:
这是对这个问题的跟进:Interface method with multiple return types
我有两个略有不同的结构。一个是关于交易结构的,另一个是关于转移结构的。目标是计算最后的数量。此外,交易结构应实现一些与传输结构不同的特定功能,反之亦然。最后他们都调用get() 函数并最终返回数量(类型字符串)。我不能来做类似qtyGetService(trade{}).calculateA().get() 的事情,其中qtyGetService() 和get() 可以从两个结构中调用,但calculateA() 是一种仅用于交易结构的方法。接口看起来首先有望解决此类问题,但我面临着该问题Interface method with multiple return types 中描述的问题,即接口中的方法必须返回特定类型。返回interface{} 也不是一个选项,因为我无法链接下面示例中所示的函数(甚至没有提到reflect 的使用)。
package main
import (
"fmt"
)
type Trade struct {
q string
// many other attributes
}
type Transfer struct {
q string
// many other attributes
}
type TradeService struct {
q string
// some other attributes
}
type TransferService struct {
q string
// some other attributes
}
type GetQty struct {
q string
// some other attributes
}
func qtyGetTradeService(str *Trade) *TradeService {
// some processing on the initial struct
return &TradeService{
q: str.q + " TradeService ",
}
}
func qtyGetTransferService(str *Transfer) *TransferService {
// some processing on the initial struct
return &TransferService{
q: str.q + " TransferService ",
}
}
func (ts *TradeService) calculateA() *GetQty {
// some processing on ts
return &GetQty{
q: ts.q + " CalculateA ",
}
}
func (ts *TradeService) calculateB() *GetQty {
// some processing on ts
return &GetQty{
q: ts.q + " CalculateB ",
}
}
func (ts *TransferService) calculateC() *GetQty {
// some processing on ts
return &GetQty{
q: ts.q + " CalculateC ",
}
}
func (gq *GetQty) get() string{
// some processing on gq common to both trade and transfer
return gq.q + " CommonGet "
}
func main() {
// this works just fine
fmt.Println(qtyGetTradeService(&Trade{q: "10"}).calculateA().get())
fmt.Println(qtyGetTransferService(&Transfer{q: "10"}).calculateC().get())
// But this would be "better" to do something like this:
fmt.Println(qtyGetService(&Trade{q: "10"}).calculateA().get())
fmt.Println(qtyGetService(&Transfer{q: "10"}).calculateC().get())
}
【问题讨论】:
-
使用接口。在具有相同签名的所有类型上定义一个共享方法,然后定义一个声明相同方法的接口。然后无论底层类型如何,您都可以调用它。
-
停止在 Go 中编写 Java。
-
如果您误解了我的评论,请原谅。你真的必须停止尝试在 Go 中编写 Java 代码,因为这根本不可能。例如。你在 get 方法中写了“在 gq 上对交易和转账通用的一些处理”。在 Go 中,你使用 functions 来做普通的工作,而不是方法。在 Java 中,您 必须 将所有内容放入一个方法中,并且在您的情况下您可以,因为您有继承。 Go 中没有继承,但有函数,您可以将通用计算放入函数中。在 Go 中,您使用方法来 A) 满足接口和 B) 信息隐藏。
-
您很可能可以摆脱所有这些服务并替换它们(或通过简单功能替换它们的其他部分,可能在接口上操作)。