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-შია — ბლოკირება გაუქმებული არხზე გაგზავნისას, თუ მიმღები არ არის.