Sobes.tech
Senior

Kurš no šiem koda fragmentiem satur kļūdu vai potenciālu problēmu, kas saistīta ar kanālu darbu? 1. variants package main func main() { ch := make(chan int) ch <- 1 } 2. variants package main func main() { ch := make(chan int, 1) ch <- 1 } 3. variants package main func main() { ch := make(chan int, 1) ch <- 1 <-ch } 4. variants package main func main() { ch := make(chan int) close(ch) <-ch } 5. variants package main func main() { ch := make(chan int, 3) ch <- 4 }

sobes.tech AI

Atbilde no AI

Kļūda ir 1. variantā:

package main
func main() {
    ch := make(chan int)
    ch <- 1
}

Šeit tiek izveidots nebuferēts kanāls ch := make(chan int). Sūtīšana šajā kanālā ch <- 1 bloķēsies, kamēr kāds nelasīs no kanāla. Šajā kodā nav neviena saņēmēja, tāpēc programma mūžīgi iestrēgs (deadlock).

  1. variants ir pareizs, jo kanāls ir ar buferi, kura izmērs ir 1, un sūtīšana neblokēsies, ja buferis nav pilns.

  2. variants arī ir pareizs: sūtīšana un saņemšana ir līdzsvarota.

  3. variants ir pareizs: no slēgta kanāla var lasīt, lasīšana atgriezīs nulles vērtību un neblokēs.

  4. variants ir pareizs: buferis 3, tiek sūtīta viena vērtība, buferis nav pilns.

Kopsavilkums: problēma ir tikai 1. variantā — bloķēšana, sūtot uz nebuferētu kanālu bez saņēmēja.