【问题标题】:Passing different type's parameters to the function将不同类型的参数传递给函数
【发布时间】:2015-07-11 09:06:08
【问题描述】:

我有这个功能,我想让它能够接收所有类型的切片,不仅是 []string,还有 []int 等等......我想知道是否有办法在将参数传递给函数头时抽象类型,或者我应该做其他事情来完成它。

package removeDuplicate

// RemoveDuplicate remove duplicate items from slice setting it to arr2
func RemoveDuplicate(arr []string) []string {
    arr2 := arr[:1]
Loop:
    for i := 1; i < len(arr); {
        for j := 0; j < len(arr2); {
            if arr[i] != arr[j] {
                j++
            } else {
                i++
                continue Loop
            }
        }
        arr2 = append(arr2, arr[i])
        i++
    }
    return arr2
}

提前致谢 =]

【问题讨论】:

  • 这些是切片,而不是数组。这很重要,因为切片可以对相同的数据进行操作,而数组是单独的值。
  • 旁注:如果切片(如前所述,不是数组)可能很大,那么更好的实现是从输入切片,然后将映射键转换为切片返回。如果这种事情经常发生,那么原始数据类型可能会更改为地图(或包含地图的复合对象)。
  • 是的,在这种情况下我应该说切片。但是因为切片描述了数组的一部分,这让我感到困惑,为什么我不能将它称为数组 - 以更通用的方式。

标签: function data-structures types go parameters


【解决方案1】:

如果您更改函数签名以接受接口{},您可以获得适用于内置类型的东西。

package main

import "fmt"

func main() {
    x := []interface{}{"bob", "doug", "bob"}
    fmt.Println(RemoveDuplicate(x))
    y := []interface{}{1, 3, 1}
    fmt.Println(RemoveDuplicate(y))
    z := []interface{}{"bob", "2", "doug", 3, 2, "bob"}
    fmt.Println(RemoveDuplicate(z)) 
}

func RemoveDuplicate(arr []interface{}) []interface{} {
    arr2 := arr[:1]
Loop:
    for i := 1; i < len(arr); {
        for j := 0; j < len(arr2); {
            if arr[i] != arr[j] {
                j++
            } else {
                i++
                continue Loop
            }
        }
        arr2 = append(arr2, arr[i])
        i++
    }
    return arr2
}

查看常见问题解答Can I convert a []T to an []interface{}?(以及之前的那个)了解更多信息。

【讨论】:

  • 谢谢,它工作得很好,而且看起来也很地道。
【解决方案2】:

Go 中的任何类型的通用算法都可以使用两种机制中的任何一种来实现:接口和反射。使用接口,您可以类似于 sort 包:

type Slice interface {
    Len() int
    Swap(i, j int)
    Eq(i, j int) bool
    SubSlice(i, j int) Slice
}

func RemoveDuplicate(s Slice) Slice {
    n := 1
Loop:
    for i := 1; i < s.Len(); i++ {
        for j := 0; j < n; j++ {
            if s.Eq(i, j) {
                continue Loop
            }
        }
        s.Swap(n, i)
        n++
    }
    return s.SubSlice(0, n)
}

带有整数和字符串的游乐场:http://play.golang.org/p/WwC27eP72n

【讨论】:

    猜你喜欢
    • 2017-05-10
    • 2018-01-02
    • 2012-10-27
    • 2023-04-02
    • 2020-02-06
    • 2018-03-26
    • 2016-02-28
    • 1970-01-01
    • 2013-01-30
    相关资源
    最近更新 更多