我正在为我的项目创建实用程序包。
我的许多字符串切片都需要一个函数来 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错误。
答案 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]
}
答案 1 :(得分:0)
如文档中所述:
您只能用接收器声明一个方法,该接收器的类型在与该方法相同的包中定义。您不能使用其他包中定义了其类型的接收器来声明方法。
因此,您必须在[]string
上声明类型,然后根据自己的类型声明方法。