J'essayais d'implémenter Heap's Algorithm en utilisant go channels. Le code ci-dessous fonctionne correctement lorsque vous imprimez les tranches sur l'écran, mais lorsque vous utilisez les canaux pour fournir les tableaux à une boucle for/range sur la fonction principale, un comportement inattendu se produit et les tranches/tableaux sont imprimés en double et toutes les permutations envoyé. J'ai pensé que peut-être je ferme le canal plus tôt que la fonction principale est capable d'imprimer les résultats mais je ne m'attendrais pas à ce double impression. Pourquoi cela se passe-t-il et comment puis-je le faire fonctionner.Plage de Golang à travers le canal avec un comportement impair lors de la mise en place de l'algorithme de permutation de tas
package main
import "fmt"
func perm(a []int64) {
var n = len(a)
var c = make([]int, n)
fmt.Println(a)
i := 0
for i < n {
if c[i] < i {
if i%2 == 0 {
a[0], a[i] = a[i], a[0]
} else {
a[c[i]], a[i] = a[i], a[c[i]]
}
fmt.Println(a)
c[i]++
i = 0
} else {
c[i] = 0
i++
}
}
}
func permch(a []int64, ch chan<- []int64) {
var n = len(a)
var c = make([]int, n)
ch <- a
i := 0
for i < n {
if c[i] < i {
if i%2 == 0 {
a[0], a[i] = a[i], a[0]
} else {
a[c[i]], a[i] = a[i], a[c[i]]
}
ch <- a
c[i]++
i = 0
} else {
c[i] = 0
i++
}
}
close(ch)
}
func main() {
var i = []int64{1, 2, 3}
fmt.Println("Without Channels")
perm(i)
ch := make(chan []int64)
go permch(i, ch)
fmt.Println("With Channels")
for slc := range ch {
fmt.Println(slc)
}
}
Pouvez-vous s'il vous plaît me montrer comment mettre en œuvre # 1 ou # 2? Je pense en ajoutant un autre canal pour signaler du principal au goroutine un peu encombrant.J'ai essayé d'utiliser builtin 'copy()' et 'make()' en créant un nouveau tableau sous-jacent mais je pense que le problème repose sur l'impression principale du tableau en même temps 'permch' le modifie. Et je ne sais vraiment pas comment utiliser les mutex car je peux verrouiller la partie de permch qui change le tableau mais cela ne garantit pas qu'il attendra 'main()' imprime le tableau. –
Yeah # 1 n'est pas très bon avec cette condition de course. Voir les modifications. – captncraig
Cela n'a pas fonctionné pour moi comme je m'y attendais: https://play.golang.org/p/QuD0aE3tQH –