πŸ’¬Π§Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ/записи ΠΈΠ· Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΈ Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°?



πŸ“ŒΠ§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°: ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ пытаСмся Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°, происходит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:



1. Если Π² ΠΊΠ°Π½Π°Π»Π΅ ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π² Π½Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ записаны, опСрация чтСния Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ.

2. Если Π² ΠΊΠ°Π½Π°Π»Π΅ большС Π½Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, опСрация чтСния Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ для Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»Π°.

3. Если ΠΊΠ°Π½Π°Π» ΡƒΠΆΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ ΠΈ Π² Π½Π΅ΠΌ Π½Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· Π½Π΅Π³ΠΎ снова ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡŽ Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ значСния для Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»Π°.



ch := make(chan int)

close(ch)

value, ok := <-ch

fmt.Println(value, ok)
// 0 false



πŸ“ŒΠ—Π°ΠΏΠΈΡΡŒ Π² Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ°Π½Π°Π»: ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΏΠ°Π½ΠΈΠΊΡƒ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ запись Π² Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» являСтся нСдопустимой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ.



ch := make(chan int)

close(ch)

ch <- 42
// panic: send on closed channel



πŸ“ŒΠ§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ (nil) ΠΊΠ°Π½Π°Π»Π° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈ запись Π² Π½Π΅ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ (nil) ΠΊΠ°Π½Π°Π».



β˜οΈΠ’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ состояния ΠΊΠ°Π½Π°Π»ΠΎΠ², ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠ°Π½ΠΈΠΊ ΠΈ нСпрСдсказуСмого повСдСния.