Sobes.tech
Middle

Šta se može raditi sa zatvorenim kanalom u Go?

sobes.tech АИ

Одговор од АИ

При čitanju iz zatvorenog kanala možete dobiti sve preostale podatke koji su zapisani pre zatvaranja. Nakon što je kanal ispražnjen, sledeće operacije čitanja će vraćati nultu vrednost tipa elementa kanala i vrednost false kao drugu vrednost, što ukazuje da je kanal zatvoren.

Slanje podataka u zatvoreni kanal izazvaće paniku tokom izvršenja.

Pokušaj zatvaranja već zatvorenog kanala takođe će izazvati paniku.

Možete proveriti da li je kanal zatvoren koristeći operator ok pri čitanju:

package main

import (
	"fmt"
)

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

	// Čitanje iz zatvorenog kanala dok ne bude prazan
	val1, ok1 := <-ch
	fmt.Printf("Vrednost: %d, Ok: %t\n", val1, ok1) // Vrednost: 1, Ok: true

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

	// Čitanje nakon što je kanal ispražnjen
	val3, ok3 := <-ch
	fmt.Printf("Vrednost: %d, Ok: %t\n", val3, ok3) // Vrednost: 0, Ok: false

	// Pokušaj slanja u zatvoren kanal (izazvaće paniku)
	// ch <- 3 // Uklonite komentar da izazovete paniku

	// Pokušaj zatvaranja već zatvorenog kanala (izazvaće paniku)
	// close(ch) // Uklonite komentar da izazovete paniku
}

Korišćenje range sa zatvorenim kanalom omogućava sekvencijalno čitanje podataka dok kanal ne bude ispražnjen, nakon čega se petlja automatski završava.

package main

import (
	"fmt"
)

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

	// Korišćenje range sa zatvorenim kanalom
	for val := range ch {
		fmt.Println(val) // Ispisaće 10, zatim 20
	}
}