我有两个结构:

type A struct {
    BankCode           string `json:"bankCode"`
    BankName           string `json:"bankName"`
}

和:
type B struct {
    A
    extra           string `json:" extra"`
}

和两片:listsA []AlistsB []B我想从bankCodeslistA获取listBbankcodes仅包含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/

10-11 13:59