Go - 合并 2 个唯一不同的是参数类型的函数

我有这两个几乎完全相同的功能:


第 1 名:


func mergeSlicesOfRequestObjects(aSliceDestination *[]RequestObject, aSliceSource []RequestObject) {

for _, oSliceSourceItem := range aSliceSource {

    // Get current key

    iIndexSourceItemFound := -1

    for iIndexAttribute, oSliceDestinationItem := range *aSliceDestination {

        if oSliceSourceItem.Key == oSliceDestinationItem.Key {

            iIndexSourceItemFound = iIndexAttribute

            break

        }

    }


    // Update attribute

    if iIndexSourceItemFound == -1 {

        *aSliceDestination = append(*aSliceDestination, oSliceSourceItem)

    }

}

}

2号:


func mergeSlicesOfResponseObjects(aSliceDestination *[]ResponseObject, aSliceSource []ResponseObject) {

for _, oSliceSourceItem := range aSliceSource {

    // Get current key

    iIndexSourceItemFound := -1

    for iIndexAttribute, oSliceDestinationItem := range *aSliceDestination {

        if oSliceSourceItem.Key == oSliceDestinationItem.Key {

            iIndexSourceItemFound = iIndexAttribute

            break

        }

    }


    // Update attribute

    if iIndexSourceItemFound == -1 {

        *aSliceDestination = append(*aSliceDestination, oSliceSourceItem)

    }

}

}

如您所见,唯一的区别是函数参数的结构类型。


所以这是我的问题:有没有办法将这两个功能合并为一个?


我试过使用接口,但我无法弄清楚......


倚天杖
浏览 150回答 1
1回答

狐的传说

定义一个接口:type Keyer interface {    Key() int // or whatever type the Key field has}然后在两种类型上实现接口:func (r RequestObject) Key() int {    return r.Key}func (r ResponseObject) Key() int {    return r.Key}并重写您的函数以采用此接口(而不是使用匈牙利符号和无休止的变量名):func mergeKeyers(dst *[]Keyer, src []Keyer) {    for _, s := range src {        f := -1        for i, d := range *dst {            if s.Key() == d.Key() {                f = i                break            }        }        if f == -1 {            *dst = append(*dst, s)        }    }}另外,请考虑 Dave C 的评论:你有一个 O(n×m) 算法,你可以使用 O(n+m) 算法。我会让你以这种方式优化你的代码。编辑以解决您的第二个问题:类型*[]RequestObject和*[]Keyer是不同的,不可互换。您需要做的是将 RequestObjects 切片转换为 Keyers 切片。这就像[]RequestObject在 type 值中迭代每个条目并将其分配给新条目一样简单[]Keyer。另请参阅这些答案:在 go 中类型转换接口切片在不同类型的切片之间转换
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go