Go 为切片字符串[]添加自定义方法
我正在为我的项目创建一个实用程序包 我的许多字符串片段都需要一个函数来 1.删除重复项 2.删除空字符串 我知道一种方法:1。为每个接受字符串片段并返回字符串片段的情况添加一个函数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
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,可能会让其他开发人员对该项目感兴趣。通常的方法是你已经拥有的,这不是一个特别惯用的围棋,它很可能会让其他开发人员放弃这个项目。通常的方法是你已经拥有的。