我有两个结构:
type A struct {
BankCode string `json:"bankCode"`
BankName string `json:"bankName"`
}
和:
type B struct {
A
extra string `json:" extra"`
}
和两片:
listsA []A
和listsB []B
我想从bankCodes
和listA
获取listB
。 bankcodes
仅包含bankcodes
。这是一个[]string
使用两个功能将非常简单。
func getBankCodes(data []A) []string {
res := make([]string, len(data))
for i := 0; i < len(data); i++ {
res[i] = data[i].BankCode
}
return res
}
func getBankCodes(data []B) []string {
res := make([]string, len(data))
for i := 0; i < len(data); i++ {
res[i] = data[i].BankCode
}
return res
}
如何使用一个常用功能?
最佳答案
好了,干净的解决方案是使用接口,因为go不支持经典继承,因此[]parentclass
之类的东西不起作用。但是,接口只能描述函数,而不能描述 public 字段,因此必须(本质上)实现Getter。
// GetBankCoder provides a function that gives the BankCode
type GetBankCoder interface {
getBankCode() string
}
// implement GetBankCoder for A (and indirectly for B)
func (a A) getBankCode() string {
return a.BankCode
}
并使您的
getBankCodes
在该接口类型上工作,请注意函数的参数以及循环内的语句:func getBankCodes(data []GetBankCoder) []string { // <-- changed
res := make([]string, len(data))
for i := 0; i < len(data); i++ {
res[i] = data[i].getBankCode() // <-- changed
}
return res
}
还有其他解决方案,其中功能参数为
interface{}
类型,然后使用反射来确保您可以实际执行.BankCode
,但是我不喜欢这些,因为它们也没有增加更多的清晰度。...但是,在将其提供给函数之前,如果没有先将其放入
[]GetBankCoder
var中,我将无法进入golang游乐场以使其正常工作。banks := make([]GetBankCoder, 0)
banks = append(banks, A{ BankCode: "ABC", BankName: "ABC Bank"})
getBankCodes(banks)
关于go - Golang将列表对象转换为字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39487543/