J'essaie de résoudre l'exercice "1.4 de la programmation de go" qui exige que je dispose d'un ensemble. Je peux créer un type de jeu, mais pourquoi la langue n'en contient-elle pas? go, venu de google, d'où provient aussi la goyave, pourquoi les concepteurs de langages n'ont-ils pas choisi d'ajouter le support des structures de données fondamentales? pourquoi forcer vos utilisateurs à créer leurs propres implémentations pour quelque chose d'aussi fondamental qu'un ensemble?
En partie, parce que Go n'a pas de génériques (vous auriez donc besoin d'un type de jeu pour chaque type, ou de la réflexion, ce qui est plutôt inefficace).
En partie, parce que si tout ce dont vous avez besoin est "ajouter/supprimer des éléments individuels à un ensemble" et "relativement peu encombrant", vous pouvez en obtenir un bon nombre simplement en utilisant un map[yourtype]bool
(et en définissant la valeur sur true
pour tout élément de l'ensemble) ou, pour plus de gain de place, vous pouvez utiliser une structure vide comme valeur et utiliser _, present = the_setoid[key]
pour vérifier la présence.
Une des raisons est qu'il est facile de créer un ensemble à partir de la carte:
s := map[int]bool{5: true, 2: true}
_, ok := s[6] // check for existence
s[8] = true // add element
delete(s, 2) // remove element
Syndicat
s_union := map[int]bool{}
for k, _ := range s1{
s_union[k] = true
}
for k, _ := range s2{
s_union[k] = true
}
Intersection
s_intersection := map[int]bool{}
for k,_ := range s1 {
if s2[k] {
s_intersection[k] = true
}
}
Il n’est pas si difficile de mettre en œuvre toutes les autres opérations d’ensembles.
Comme l'a écrit Vatine: Comme il manque des génériques, il devrait faire partie du langage et non de la bibliothèque standard. Pour cela, vous devrez alors polluer la langue avec les mots-clés set, union, intersection, difference, subset ...
L'autre raison est que la "bonne" mise en œuvre d'un ensemble n'est pas claire du tout:
Il y a une approche fonctionnelle:
func IsInEvenNumbers(n int) bool {
if n % 2 == 0 {
return true
}
return false
}
Ceci est un ensemble de tous même ints. Il a une recherche très efficace et l'union, l'intersection, la différence et le sous-ensemble peuvent facilement être effectués par composition fonctionnelle.
Une carte n'a pas ce problème, car vous stockez quelque chose associé à la valeur.