Sobes.tech
Middle

Go-da bağlanmış kanaldan oxuma zamanı hansı nəticələr ortaya çıxa bilər?

sobes.tech Süni İntellekt

AI-dan cavab

Bağlanmış kanaldan oxumaq, kanalın element növünün null dəyərini dərhal alır və bloklamır. Əgər ikinci boolean parametr qaytarılırsa, o false olacaq.

package main

import (
	"fmt"
)

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

	val, ok := <-ch // Bağlanmış kanaldan oxumaq
	fmt.Printf("Dəyər: %d, Açıq: %t\n", val, ok) // "Dəyər: 1, Açıq: true" göstərəcək

	val, ok = <-ch // Eyni bağlanmış kanaldan təkrar oxumaq
	fmt.Printf("Dəyər: %d, Açıq: %t\n", val, ok) // "Dəyər: 0, Açıq: false" göstərəcək

	// Bağlanmış kanaldan əlavə oxumalar
	val, ok = <-ch
	fmt.Printf("Dəyər: %d, Açıq: %t\n", val, ok) // "Dəyər: 0, Açıq: false" göstərəcək
}

Əsas nəticələr:

  • Null dəyər əldə etmək: Proqram çökməyəcək, lakin kanala aid standart null dəyər alınacaq.
  • Bağlanma göstəricisi: İkinci boolean parametr, istifadə olunarsa, false olur, bu da kanalın bağlandığını və alınan dəyərin null olduğunu göstərir.
  • Bloklamadan oxuma: Oxuma əməliyyatı goroutine-i bloklamayacaq.
  • Panika olmadan: Bağlanmış kanala yazmaqdan fərqli olaraq, bağlanmış kanaldan oxuma panik yaratmır.

Açıq və bağlanmış kanaldan oxuma müqayisəsi:

Kanal vəziyyəti Əməliyyat Davranış Qaytarılan dəyər (əgər ikinci parametr mövcuddursa)
Açıq <-ch Bloklama, dəyər və ya bağlanma alınana qədər Dəyər, true
Açıq val, ok := <-ch Bloklama, dəyər və ya bağlanma alınana qədər Dəyər, true
Bağlanmış <-ch Dərhal alınır Null dəyər
Bağlanmış val, ok := <-ch Dərhal alınır Null dəyər, false

İkinci boolean parametrinin istifadəsi, kanaldan real elementin alınıb-alınmadığını və ya kanalın bağlandığını müəyyən etmək üçün tövsiyə olunan yoldur.

package main

import (
	"fmt"
)

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

	for {
		val, ok := <-ch
		if !ok {
			fmt.Println("Kanal bağlandı, döngüdən çıxılır.")
			break
		}
		fmt.Printf("Alınan dəyər: %d\n", val)
	}
}

Bu davranış, kanal bağlandıqdan sonra onu oxuyan goroutine-lərin şık şəkildə sona çatmasını təmin edir.