Editor PHP Zimo memperkenalkan: Dalam bahasa Go, pernyataan pilih ialah pernyataan aliran kawalan yang sangat penting Ia digunakan untuk memantau operasi berbilang saluran pada masa yang sama untuk mencapai kawalan serentak. Mengapa anda perlu menunggu untuk pemilihan? Ini kerana dalam pengaturcaraan serentak, kita biasanya perlu memproses data atau peristiwa daripada berbilang saluran pada masa yang sama, dan penyataan pilih boleh membantu kita memantau berbilang saluran Setelah mana-mana satu saluran boleh dikendalikan, operasi yang sepadan akan dilakukan. dengan itu mencapai kesepakatan bersama. Dengan menggunakan pilih, kami boleh mengelak daripada menyekat dan meningkatkan responsif dan keselarasan program dengan berkesan.
Saya baru belajar pembatalan konteks. Inilah kod saya.
package main import ( "fmt" "context" ) func main() { ctx := context.Background() do(ctx) } func do(ctx context.Context) { ctx, ctxCancel := context.WithCancel(ctx) resultCh := make(chan string) go terminate(ctx, resultCh) resultCh <- "value1" resultCh <- "value2" fmt.Println("pre cancel") ctxCancel() fmt.Println("post cancel") } func terminate(ctx context.Context, ch <-chan string) { for { select { case <-ctx.Done(): fmt.Println("terminate") return case result := <-ch: fmt.Println(result) } } }
Mengapa ini berlaku. Apakah pengetahuan yang saya perlukan?
Tetapi output sebenar yang diperolehi tidak mengandungi "termination".
value1 value2 pre cancel terminate post cancel
Saya menambah masa.Tidur di bawah fungsi batal. Kemudian output adalah apa yang saya harapkan.
ctxCancel() time.Sleep(100 * time.Millisecond) // add
Seperti yang saya faham, idea teras di sebalik penggunaan pilih ialah menunggu sekurang-kurangnya satu syarat untuk "bersedia". Saya telah sertakan contoh di bawah yang mungkin membantu. Di sini pilih digunakan untuk menunggu nilai diterima daripada saluran ch atau tamat masa 1 saat berlaku.
import ( "fmt" "time" ) func main() { ch := make(chan int) go func() { // Simulate some time-consuming operation time.Sleep(2 * time.Second) ch <- 42 }() select { case result := <-ch: fmt.Println("Received result:", result) case <-time.After(1 * time.Second): fmt.Println("Timeout reached") } }
Atas ialah kandungan terperinci Mengapa kita perlu menunggu pilihan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!