yoklateknik mülakat

Go Backend Mülakat Soruları

450 doğrulanmış Go Backend mülakat sorusu — cevaplarıyla çöz, açıklamalarıyla öğren, gerçek simülasyonda kendini test et.

Gerçek simülasyonu dene →

Örnek sorular

Go ConcurrencyZorluk 1
func main() {
	go fmt.Println("hello from goroutine")
}

Bu program çalıştığında ne olur?
  • amain bitmeden önce her zaman "hello from goroutine" yazdırılır
  • bGoroutine bitene kadar sonsuza kadar bloklanır
  • cmain, goroutine çalışmadan dönebilir; bu yüzden yazdırma hiç gerçekleşmeyebilir
  • dDerleyici, sonucu kullanılmayan bir çağrıda go kullanımını reddeder
Açıklama:main, diğer goroutine'leri beklemez. main döndüğünde process hemen sonlanır; bu yüzden hemen önce başlatılan bir goroutine hiç schedule edilmeyebilir. Örtük bir join yoktur ve dönüş değeri kullanılmasa da go fmt.Println(...) derlenir.
Go ConcurrencyZorluk 1
Go'da unbuffered channel ile buffered channel arasındaki temel semantik fark nedir?
  • aUnbuffered channel'lar yalnızca pointer taşıyabilir, buffered channel'lar her tipi taşıyabilir
  • bUnbuffered gönderme, bir alıcı hazır olana kadar bloklanır; buffered gönderme yalnızca dolunca bloklanır
  • cBuffered channel'lar gönderme veya almada asla bloklanmaz
  • dUnbuffered channel'lar select gerektirir, buffered channel'lar gerektirmez
Açıklama:Unbuffered channel'ın kapasitesi yoktur, bu yüzden gönderme doğrudan eşleşen bir almayla senkronize olur. Buffered channel ise gönderme bloklanmadan önce sabit sayıda değerin kanalda beklemesine izin vererek gönderici ve alıcının zamanlamasını o kapasiteye kadar ayrıştırır.
Go ConcurrencyZorluk 2
ch := make(chan int)
close(ch)
v, ok := <-ch
fmt.Println(v, ok)

Bu ne yazdırır?
  • a0 false
  • bKanal kapalı olduğu için panic olur
  • c0 true
  • dGönderici olmadığı için sonsuza kadar bloklanır
Açıklama:Kapalı bir kanaldan alma işlemi asla bloklanmaz ve asla panic olmaz. Element tipinin zero value'sunu (int için 0) hemen döner ve ok değeri false olur; bu, kanalın kapalı ve boşaltılmış olduğunu gösterir.
Go ConcurrencyZorluk 2
ch := make(chan int, 2)
close(ch)
ch <- 1

Bu kod çalıştığında ne olur?
  • aKanal kapalı olduğu için 1 değeri sessizce atılır
  • b"send on closed channel" hatasıyla panic olur
  • cBuffer'da yer olduğu için başarılı olur
  • dBir alıcı bekleyerek sonsuza kadar bloklanır
Açıklama:Kapalı bir kanala gönderme, kalan buffer kapasitesinden bağımsız olarak her zaman panic ile sonuçlanır. Buffer alanı yalnızca açık kanallar için önemlidir; close çağrıldıktan sonra herhangi bir gönderme, runtime'ın hemen bildirdiği bir programlama hatasıdır.
Go ConcurrencyZorluk 2
var ch chan int
<-ch

İkinci satırdaki alma işleminin davranışı nedir?
  • ach, make ile hiç initialize edilmediği için panic olur
  • bKapalı bir kanal gibi zero value'yu hemen döner
  • cNil kanalı açıklayan bir error değeri döner
  • dNil kanal asla hazır olmadığı için sonsuza kadar bloklanır
Açıklama:ch, nil bir kanaldır (deklare edilmiş ama hiç make edilmemiş). Nil kanal üzerindeki işlemler panic olmak ya da hemen dönmek yerine kalıcı olarak bloklanır — bu, herhangi bir hata mesajı vermeden asılı kalan goroutine'lerin yaygın bir sebebidir.
Go ConcurrencyZorluk 2
ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3
close(ch)
for v := range ch {
	fmt.Println(v)
}

Bu ne yazdırır?
  • aYalnızca 1, sonra kanal kapalı olduğu için loop panic olur
  • b1 2 3, sonra sonsuza kadar 0 yazdırarak döner
  • c1 2 3, ve kanal boşalınca loop biter
  • dHiçbir şey, çünkü kapalı bir kanal üzerinde range yapılamaz
Açıklama:Bir kanal üzerinde range, kanal hem kapanana hem de boşalana kadar değer alır, sonra loop normal şekilde biter — panic yok, fazladan zero value yok. Buffer, close'dan önce zaten 1, 2, 3'ü tuttuğu için loop üçünü de teslim eder ve durur.

3300 soruluk Backend bankasında kendini sına.

Mülakata başla