Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 为切片字符串[]添加自定义方法_Go - Fatal编程技术网

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

Go 为切片字符串[]添加自定义方法,go,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

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

我的许多字符串片段都需要一个函数来 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()

也许我可以将自定义方法添加到切片[]

我试着写它

func (s []string) removeEmpty() {

}

我收到一个复杂错误。

您不能在
[]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]
}

请参阅。

您不能在
[]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]
}

参见文档中提到的。

您只能声明具有接收器的方法,该接收器的类型在与该方法相同的包中定义。不能声明具有接收器的方法,该接收器的类型在另一个包中定义


因此,您必须在
[]字符串上声明一个类型,然后在您自己的类型上声明方法。

如文档中所述:

您只能声明具有接收器的方法,该接收器的类型在与该方法相同的包中定义。不能声明具有接收器的方法,该接收器的类型在另一个包中定义


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

这不是一个特别惯用的Go,可能会让其他开发人员对该项目感兴趣。通常的方法是你已经拥有的,这不是一个特别惯用的围棋,它很可能会让其他开发人员放弃这个项目。通常的方法是你已经拥有的。