我有一个字符串数组,我想排除以foo_OR开头的长度超过 7 个字符的值。
foo_
我可以循环遍历每个元素,运行if语句,然后将其添加到切片中。但我很好奇是否有一种惯用的或更类似于 golang 的方式来实现这一点。
if
举个例子,同样的事情可能在 Ruby 中完成
my_array.select! { |val| val !~ /^foo_/ && val.length <= 7 }
没有 Ruby 中的单行代码,但是使用辅助函数,您可以使它几乎一样短。
这是我们的辅助函数,它在切片上循环,并仅选择并返回满足函数值捕获的条件的元素:
func filter(ss []string, test func(string) bool) (ret []string) { for _, s := range ss { if test(s) { ret = append(ret, s) } } return }
使用此助手功能您的任务:
ss := []string{"foo_1", "asdf", "loooooooong", "nfoo_1", "foo_2"} mytest := func(s string) bool { return !strings.HasPrefix(s, "foo_") && len(s) <= 7 } s2 := filter(ss, mytest) fmt.Println(s2)
输出(在Go Playground上试试):
[asdf nfoo_1]
笔记:
如果预计将选择许多元素,则ret预先分配一个“大”切片并使用简单赋值而不是append(). 在返回之前,将 切片ret使其长度等于所选元素的数量。
ret
append()
笔记2:
在我的示例中,我选择了一个test()函数来判断是否要返回元素。所以我不得不颠倒你的“排除”条件。显然,您可能会编写辅助函数来期望测试器函数告诉您要排除什么(而不是要包括什么)。
test()