Sobes.tech
Middle

Mida saab teha suletud kanaliga Go-s?

sobes.tech AI

Vastus AI-lt

Kanali, mis on suletud, võimaldavad lugeda kõiki järelejäänud andmeid, mis on enne sulgemist salvestatud. Pärast kanali tühjendamist tagastavad järgnevad lugemistoimingud kanali elemendi tüüpi nullväärtuse ja teise väärtusena false, mis näitab, et kanal on suletud.

Andmete saatmine suletud kanalile põhjustab jooksuaegse vea.

Juba suletud kanali sulgemine põhjustab samuti jooksuaegse vea.

Saate kontrollida, kas kanal on suletud, kasutades lugemisel ok operaatorit:

package main

import (
	"fmt"
)

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

	// Lugemine suletud kanalilt kuni tühjendamiseni
	val1, ok1 := <-ch
	fmt.Printf("Väärtus: %d, Ok: %t\n", val1, ok1) // Väärtus: 1, Ok: true

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

	// Lugemine pärast kanali tühjendamist
	val3, ok3 := <-ch
	fmt.Printf("Väärtus: %d, Ok: %t\n", val3, ok3) // Väärtus: 0, Ok: false

	// Katse saata suletud kanalile (tekitab panic)
	// ch <- 3 // Kommenteerides selle rea, põhjustab see panic

	// Katse sulgeda juba suletud kanalit (tekitab panic)
	// close(ch) // Kommenteerides selle rea, põhjustab see panic
}

Range'i kasutamine suletud kanaliga võimaldab järjest lugeda andmeid kuni kanal on tühjendatud, pärast mida tsükkel automaatselt lõpeb.

package main

import (
	"fmt"
)

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

	// Range'i kasutamine suletud kanaliga
	for val := range ch {
		fmt.Println(val) // Kuvab 10, siis 20
	}
}