为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
倚天杖 2021-11-01 15:51:57
我有这两个几乎完全相同的功能:第 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)    }}}如您所见,唯一的区别是函数参数的结构类型。所以这是我的问题:有没有办法将这两个功能合并为一个?我试过使用接口,但我无法弄清楚......
查看完整描述

1 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

定义一个接口:


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 中类型转换接口切片

在不同类型的切片之间转换


查看完整回答
反对 回复 2021-11-01
  • 1 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信