Sobes.tech
Middle

Ko var darīt ar slēgtu kanālu Go?

sobes.tech AI

Atbilde no AI

Lasot no slēgtā kanāla var iegūt visus atlikušos datus, kas tika ierakstīti pirms slēgšanas. Pēc kanāla iztukšošanas turpmākās lasīšanas operācijas atgriezīs nulles vērtību kanāla elementa tipā un vērtību false kā otro atgrieztās vērtības, norādot, ka kanāls ir slēgts.

Datu sūtīšana slēgtā kanālā izraisīs izpildlaika kļūmi.

Mēģinājums aizvērt jau slēgtu kanālu arī izraisīs izpildlaika kļūmi.

Var pārbaudīt, vai kanāls ir slēgts, izmantojot ok operatoru lasīšanas laikā:

package main

import (
	"fmt"
)

func main() {
	ch := make(chan int, 2)
	ch <- 1
	ch <- 2
	close(ch)

	// Lasīšana no slēgta kanāla līdz iztukšošanai
	val1, ok1 := <-ch
	fmt.Printf("Vērtība: %d, Ok: %t\n", val1, ok1) // Vērtība: 1, Ok: true

	val2, ok2 := <-ch
	fmt.Printf("Vērtība: %d, Ok: %t\n", val2, ok2) // Vērtība: 2, Ok: true

	// Lasīšana pēc kanāla iztukšošanas
	val3, ok3 := <-ch
	fmt.Printf("Vērtība: %d, Ok: %t\n", val3, ok3) // Vērtība: 0, Ok: false

	// Mēģinājums sūtīt uz slēgtu kanālu (izraisīs kļūmi)
	// ch <- 3 // Komentējot šo rindu, tas radīs kļūmi

	// Mēģinājums aizvērt jau slēgtu kanālu (izraisīs kļūmi)
	// close(ch) // Komentējot šo rindu, tas radīs kļūmi
}

Izmantojot range ar slēgtu kanālu, ļauj lasīt datus secīgi līdz brīdim, kad kanāls ir iztukšots, pēc kura cikls automātiski beidzas.

package main

import (
	"fmt"
)

func main() {
	ch := make(chan int, 3)
	ch <- 10
	ch <- 20
	close(ch)

	// Izmantojot range ar slēgtu kanālu
	for val := range ch {
		fmt.Println(val) // Izvadīs 10, tad 20
	}
}