Apabila bekerja dengan goroutine, adalah penting untuk mempertimbangkan tamat masa dan pengurusan goroutine. Coretan kod berikut menunjukkan fungsi yang menggabungkan tamat masa gabungan untuk beberapa panggilan HTTP:
<code class="go">func Find() (interface{}, bool) { ch := make(chan Response, 1) go func() { data, status := findCicCode() ch <- Response{data: data, status: status} }() select { case response := <-ch: return response.data, response.status case <-time.After(50 * time.Millisecond): return "Request timed out", false } }</code>
Walaupun pendekatan ini menyediakan cara untuk mengendalikan tamat masa, terdapat kebimbangan bahawa panggilan HTTP mungkin diteruskan di latar belakang walaupun selepas tamat masa telah tamat. Untuk menangani perkara ini, pertimbangkan untuk menggunakan konteks, yang menyediakan kawalan terperinci ke atas pembatalan:
<code class="go">// create a timeout or cancelation context to suit your requirements ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() req, err := http.NewRequest("GET", location, nil) // add the context to each request and they will be canceled in unison resp, err := http.Do(req.WithContext(ctx))</code>
Dengan memasukkan konteks, anda boleh membatalkan permintaan HTTP secara seragam, memastikan permintaan tersebut tidak dibiarkan berjalan di latar belakang. Teknik ini membantu mengelakkan kebocoran goroutine dan mengekalkan integriti kod.
Atas ialah kandungan terperinci Bagaimana untuk Mencegah Kebocoran Goroutine dan Mengurus Masa Tamat Dengan Berkesan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!