Editor PHP Banana memperkenalkan bahawa Golang ialah bahasa pengaturcaraan yang berkuasa, dan goroutine ialah salah satu ciri penting pengaturcaraan serentak. Di Golang, kita selalunya perlu membandingkan kesetaraan dua pokok, iaitu untuk menentukan sama ada dua pokok mempunyai struktur dan nilai yang sama. Menggunakan goroutine untuk melaksanakan operasi perbandingan pokok boleh meningkatkan kecekapan program dan prestasi serentak. Dengan melakukan perbandingan rekursif nod dua pokok secara selari, masa perbandingan boleh dikurangkan dengan ketara. Kaedah ini bukan sahaja mudah dan cekap, tetapi juga mudah difahami dan dilaksanakan. Oleh itu, menggunakan goroutine untuk membandingkan dua pokok di Golang adalah pendekatan yang disyorkan.
Tanpa menggunakan saluran saya boleh membandingkan dua pokok untuk melihat sama ada ia setara, tetapi dengan saluran saya tidak dapat mengetahui cara melakukannya.
Ini adalah contoh kod yang saya tulis menggunakan saluran.
func Walk(t *Tree, ch chan int) { if t == nil { return } Walk(t.Left, ch) ch <- t.Value Walk(t.Right, ch) } func Same(t1, t2 *Tree) bool { t1Ch := make(chan int) t2Ch := make(chan int) Walk(t1, t1Ch) Walk(t2, t2Ch) output := make(chan bool) go func() { n1 := <-t1Ch n2 := <-t2Ch output <- n1 == n2 }() return <-output } func main() { fmt.Println((&root, &root1)) }
Nota:: Anda boleh mendapatkan penerangan penuh di sini https://go.dev/tour/concurrency/7
Pertama sekali, anda harus menutup saluran selepas selesai berjalan di atas pokok. Ini boleh dilakukan dengan mencabut fungsi rekursif seperti berikut:
func walk(t *tree.tree, ch chan int) { defer close(ch) if t != nil { ch <- t.value walkrecursively(t.left, ch) walkrecursively(t.right, ch) } } func walkrecursively(t *tree.tree, ch chan int) { if t != nil { ch <- t.value walkrecursively(t.left, ch) walkrecursively(t.right, ch) } }
Kini fungsi same() anda boleh meliputi kedua-dua saluran dan mengetahui apabila kerja selesai:
func same(t1, t2 *tree.tree) bool { // two channels for walking over two trees ch1 := make(chan int) ch2 := make(chan int) // two integer slices to capture two results sequence1 := []int{} sequence2 := []int{} // two go routines to push values to the channels // important! these must be go routines go walk(t1, ch1) go walk(t2, ch2) // range over the channels to populate the sequence vars for n1 := range ch1 { sequence1 = append(sequence1, n1) } for n2 := range ch2 { sequence2 = append(sequence2, n2) } // since trees are randomly structured, we sort sort.ints(sequence1) sort.ints(sequence2) // slicesareequal is a helper function return slicesareequal(sequence1, sequence2) }
Fungsi pembantu anda mungkin kelihatan seperti ini:
func slicesAreEqual(a, b []int) bool { if len(a) != len(b) { return false } for i, v := range a { if v != b[i] { return false } } return true }
Atas ialah kandungan terperinci Menggunakan goroutine untuk membandingkan dua pokok di Golang adalah setara. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!