一尘不染

在 Golang 中从数组中选择元素的最惯用方法?

go

我有一个字符串数组,我想排除以foo_OR开头的长度超过 7 个字符的值。

我可以循环遍历每个元素,运行if语句,然后将其添加到切片中。但我很好奇是否有一种惯用的或更类似于 golang 的方式来实现这一点。

举个例子,同样的事情可能在 Ruby 中完成

my_array.select! { |val| val !~ /^foo_/ && val.length <= 7 }

阅读 207

收藏
2021-12-28

共1个答案

一尘不染

没有 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使其长度等于所选元素的数量。

笔记2:

在我的示例中,我选择了一个test()函数来判断是否要返回元素。所以我不得不颠倒你的“排除”条件。显然,您可能会编写辅助函数来期望测试器函数告诉您要排除什么(而不是要包括什么)。

2021-12-28