登录
首页 >  Golang >  Go问答

合并任意类型数组的最佳实践和减少重复代码解决方案

来源:stackoverflow

时间:2024-03-20 16:00:32 268浏览 收藏

合并任意类型数组时,Go 语言的类型不兼容性会带来挑战。传统方法需要迭代和类型转换,既繁琐又低效。一种替代方案是使用比较函数,将不存在于第一个数组中的第二个数组元素附加到第一个数组中。这种方法虽然效率不高,但可以实现不同类型数组的合并,避免了类型兼容性问题。

问题内容

我想创建一个实用函数,它能够合并两个给定的切片,通过给定函数确定相等性。

type IsEqualTest func(interface{}, interface{}) bool

func ArrayMerge(one *[]interface{}, another *[]interface{}, comp IsEqualTest) *[]interface{} {
    merged := *one

    for _, element := range *another {
        if !ArrayContains(one, &element, comp) {
            merged = append(merged, element)
        }
    }

    return &merged
}

func ArrayContains(container *[]interface{}, eventualContent *interface{}, comp IsEqualTest) bool {
    for _, element := range *container {
        if comp(element, eventualContent) {
            return true
        }
    }

    return false
}

// please don't mind the algorithmic flaws

但是,由于 go 确实将 []interface{} 类型视为与任何东西的切片不兼容(并且它缺少泛型),所以我需要迭代两个操作数,在以下情况下转换所包含元素的类型打电话,这不是任何人想要的。

处理包含任何类型的集合的 go 风格是什么?


解决方案


首先:如果没有泛型,就没有惯用的方法来做到这一点。 第二:你的思维可能太受其他语言的影响。您已经有了一个可以比较的函数,为什么不进一步进行比较呢?

我下面的建议效率不高,不应该这样做。但是,如果您真的想这样做:

看起来这不是集合并集,但如果第一个切片中尚不存在第二个切片的元素,则将它们添加到第一个切片中。为此,您可以传递两个函数:

func merge(len1,len2 int, eq func(int,int)bool, write func(int)) {
   for i2:=0;i2

上面,如果 slice1[i]==slice2[j]eq(i,j) 返回 true,并且 write(j) 执行 append(result,slice2[j])

理论要掌握,实操不能落!以上关于《合并任意类型数组的最佳实践和减少重复代码解决方案》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>