Non v'è alcun one-liner, come lo avete in Ruby, ma con una funzione di supporto si può fare quasi altrettanto breve.
Ecco la nostra funzione di supporto che loop su una fetta, e seleziona e restituisce solo gli elementi che soddisfano un criterio catturato da un valore di funzione:
func choose(ss []string, test func(string) bool) (ret []string) {
for _, s := range ss {
if test(s) {
ret = append(ret, s)
}
}
return
}
Usando questa funzione di supporto il vostro compito:
ss := []string{"foo_1", "asdf", "loooooooong", "nfoo_1", "foo_2"}
mytest := func(s string) bool { return !strings.HasPrefix(s, "foo_") && len(s) <= 7 }
s2 := choose(ss, mytest)
fmt.Println(s2)
uscita (provate sul Go Playground):
[asdf nfoo_1]
Nota:
Se si prevede che saranno selezionati molti elementi, potrebbe essere vantaggioso per assegnare un "grande" fetta ret
in anticipo, e utilizzare una semplice assegnazione al posto del append()
. E prima di tornare, suddividere lo ret
per avere una lunghezza uguale al numero di elementi selezionati.
Nota # 2:
Nel mio esempio ho scelto una funzione test()
che indica se un elemento deve essere restituito. Quindi ho dovuto invertire la tua condizione di "esclusione". Ovviamente puoi scrivere la funzione di supporto per aspettarti una funzione tester che indichi cosa escludere (e non cosa includere).
Grazie per la spiegazione! Questo è un bel modo per farlo – user2490003
Upvote per l'uso di 'choose' invece di' filter', molto altro Go idiomatico per "scegliere" cosa si vuole restituire rispetto a "filter". – Verran
@Verran "scegli", per me, implica solo un risultato (forse a caso). Il "filtro", tuttavia, viene utilizzato in tutte le lingue e in tutte le librerie esistenti con una chiara visione di una condizione che consente di far passare alcune cose bloccandone altre. –