Sobes.tech
Senior

რომელი ქვემოთ მოცემული კოდის ფრაგმენტი შეიცავს შეცდომას ან პოტენციურ პრობლემას არხებთან მუშაობის დროს? ვარიანტი 1 package main func main() { ch := make(chan int) ch <- 1 } ვარიანტი 2 package main func main() { ch := make(chan int, 1) ch <- 1 } ვარიანტი 3 package main func main() { ch := make(chan int, 1) ch <- 1 <-ch } ვარიანტი 4 package main func main() { ch := make(chan int) close(ch) <-ch } ვარიანტი 5 package main func main() { ch := make(chan int, 3) ch <- 4 }

sobes.tech AI

პასუხი AI-სგან

შეცდომა მდებარეობს ვარიანტ 1-ში:

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

აქ ქმნის არაბუფერიან არხს ch := make(chan int). გაგზავნა ამ არხზე ch <- 1 ბლოკდება მანამ, სანამ ვინმე არ წაიკითხავს არხიდან. ამ კოდში არ არის მიმღები, ამიტომ პროგრამა სამუდამოდ გაჩერდება (deadlock).

ვარიანტი 2 სწორია, რადგან არხი ბუფერით არის ზომით 1, და გაგზავნა არ ბლოკდება, თუ ბუფერი სავსე არ არის.

ვარიანტი 3 ასევე სწორია: გაგზავნა და მიღება ბალანსშია.

ვარიანტი 4 სწორია: შეიძლება წაიკითხო დახურულ არხიდან, წაკითხვა დაბრუნებს ნულოვან მნიშვნელობას და არ ბლოკდება.

ვარიანტი 5 სწორია: ბუფერი 3, ერთ მნიშვნელობას აგზავნი, ბუფერი სავსე არ არის.

საერთო ჯამში, პრობლემა მხოლოდ ვარიანტ 1-შია — ბლოკირება გაუქმებული არხზე გაგზავნისას, თუ მიმღები არ არის.