为切片字符串添加自定义方法[]

时间:2019-04-12 17:36:26

标签: go

我正在为我的项目创建实用程序包。

我的许多字符串切片都需要一个函数来 1.删​​除重复项 2.删除空字符串

我知道这样做的一种方法:1。为每种情况添加一个函数,该函数接受字符串切片并返回字符串切片

func removeEmpty(s []string) []string {

    i := 0 // i points to next available pos

    for _, v := range s {
        if v != "" {
            s[i] = v
            i++
        }
    }

    return s[:i]
}

func dedup(s []string) []string {

    i := 0 // i points to next available pos
    mp := map[string]bool{}

    for _, v := range s {
        if _, ok := mp[v]; !ok {
            s[i] = v
            mp[v] = true
            i++
        }
    }

    return s[:i]
}

当我将这两个函数应用于切片时,我可以做到:

mySlice := string[]{}
mySlice = dedup(removeEmpty(mySlice))

我想像这样:

mySlice = mySlice.dedup().removeEmpty()

mySlice.dedup().removeEmpty()

也许我可以将自定义方法添加到slice []吗?

我试图写它

func (s []string) removeEmpty() {

}

我遇到了compile错误。

2 个答案:

答案 0 :(得分:3)

您无法在[]string上定义方法,但是可以基于[]string定义自己的类型并在其上定义方法:

type myStringSlice []string

func (s myStringSlice) removeEmpty() myStringSlice {
    i := 0 // i points to next available pos

    for _, v := range s {
        if v != "" {
            s[i] = v
            i++
        }
    }

    return s[:i]
}

func (s myStringSlice) dedup() myStringSlice {

    i := 0 // i points to next available pos
    mp := map[string]bool{}

    for _, v := range s {
        if _, ok := mp[v]; !ok {
            s[i] = v
            mp[v] = true
            i++
        }
    }

    return s[:i]
}

请参见https://play.golang.org/p/u1z_N3c_wPP

答案 1 :(得分:0)

如文档中所述:

  

您只能用接收器声明一个方法,该接收器的类型在与该方法相同的包中定义。您不能使用其他包中定义了其类型的接收器来声明方法。

因此,您必须在[]string上声明类型,然后根据自己的类型声明方法。