回答

收藏

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

技术问答 技术问答 308 人阅读 | 0 人回复 | 2023-09-11

我有一个字符串数组,我想排除foo_OR开头的长度超过 7 个字符的值。+ Z) ?: D4 Q) m: |7 [7 O3 ?' Q
我可以循环我都可以循环运行if然后将句子添加到切片中。但我很好奇是否有一种常用的或更像 golang 实现这一点的方法。- ~$ M6 M4 Q" C2 S: K$ \
例如,同样的事情可能是 Ruby 中完成! s3 s) d) S) v6 W# Q" Y
    / }0 Y2 Q! w8 |' J$ |: [" J2 \! x
  • my_array.select! { |val| val !~ /^foo_/ && val.length 没有 Ruby 单行代码,但使用辅助函数,你可以使它几乎同样短。
    ( o5 h9 ?0 C$ F% t
  • 这是我们的辅助函数,它在切片上循环,只选择并返回符合函数值捕获条件的元素:[code]func filter(ss []string,test func(string) bool) (ret []string)    for _,s := range ss        if test(s)            ret = append(ret,s)         return}
    $ N6 w8 Y& H! H" }* x
使用此助手功能您的任务:
" S* K( D( h% A, c+ W

    ' b, P1 W: [; Y0 l; p' H6 u
  • ss := []string{"foo_1","asdf","loooooooong","nfoo_1","foo_2"}mytest := func(s string) bool { return !strings.HasPrefix(s,"foo_") && len(s) 输出(在Go Playground上试试):[code][asdf nfoo_1]
    $ ]8 U$ |  ^; f1 B* T
笔记:
- n) K4 N  i) n% x, D( ~若预计会选择许多元素,则ret提前分配一个大切片,而不是简单的赋值append(). 返回前将 切片ret使其长度等于所选元素的数量。; Q0 h$ |3 b1 B; A
笔记2:$ z3 Q4 }& V. k6 u* K/ Q
在我的例子中,我选择了一个test()函数来判断是否返回元素。所以我必须逆转你的排除条件。显然,你可能会编写辅助函数来期望测试器函数告诉你排除什么(而不是包括什么)。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则