Je tente de porter un C to Go.Recherche d'un élément par itérer dans une liste Aller
Je suis essentiellement à la recherche de quelque chose Aller semblable à find :: (a -> Bool) -> [a] -> Maybe a
Haskell je (à peu près) ce C pour trouver un élément dans une « liste » par itérer à travers elle:
struct foo {
struct foo *next;
char *name;
}
struct foo *foo_list;
// Snip
struct foo *foo = NULL;
for (f = foo_list; f; f = f->next) {
if (!strcmp("bar", f->name) {
foo = f;
}
}
if (foo)
// Stuff
Comment puis-je le faire gentiment et idiomatiquement dans Go?
La "liste" est susceptible d'être petite; les caractéristiques de performance ne sont pas particulièrement intéressantes. Je veux probablement un slice
, ou un list
? Une "liste" de Foo
s ou *Foo
s?
J'ai actuellement ce qui suit, mais je soupçonne que ce n'est pas particulièrement "idiomatique Go"!
var FooTable *list.List
// Snip
var foo *Foo = nil
for e := FooTable.Front(); e != nil; e = e.Next() {
if e.Value.(*Foo).name == "bar" {
foo = e.Value.(*Foo)
break
}
}
Quelles sont les caractéristiques de l'utilisation de la structure de données? Vous dites que sa petite taille et la performance n'est pas intéressante. Si elle est petite, quelle que soit la structure utilisée, elle ira probablement dans le cache, donc la simplicité et la robustesse dominent probablement. Cependant, quelles sont les opérations communes? La recherche domine-t-elle? Y a-t-il beaucoup d'insertions et de suppressions, même si elles restent petites? Les seules opérations délicates sur les tranches sont delete et insert, et elles sont encore assez simples à écrire dans Go. Si la seule valeur est une chaîne, alors une tranche de chaînes est probablement la plus simple. L'ajout de tri est facile aussi. – gbulmer