yoklateknik mülakat

Backend Go Memory Performance Mülakat Soruları

75 doğrulanmış Backend Go Memory Performance 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 Memory PerformanceZorluk 1
Go'da bir slice değeri; bir pointer, bir length ve bir capacity içeren küçük bir header'dır. Capacity neyi ifade eder?
  • aSlice içinde şu anda depolanan eleman sayısı, yani length ile aynı şey
  • bSlice'ın başlangıcından itibaren alttaki dizide sığan eleman sayısı
  • cSlice header'ının kendisi için ayrılan toplam bellek miktarı (byte cinsinden)
  • dGo'nun herhangi bir slice'a izin verdiği azami eleman sayısı
Açıklama:Length, slice'ın şu an gösterdiği eleman sayısıdır. Capacity ise alttaki dizinin slice'ın başlangıcından itibaren ne kadar ileri gittiğidir; bu sayede append, capacity dolana kadar yeni dizi ayırmadan bu alana büyüyebilir.
Go Memory PerformanceZorluk 2
Bu program ne yazdırır?

a := make([]int, 3, 3)
a[0], a[1], a[2] = 1, 2, 3
b := append(a, 4)
b[0] = 99
fmt.Println(a[0])
  • a1
  • b99
  • c4
  • dBu kod derlenmez
Açıklama:a'nın length'i 3, capacity'si de 3'tür; yani zaten doludur. append(a, 4) büyüyecek yer bulamaz, bu yüzden Go, b için yepyeni bir alttaki dizi ayırıp elemanları oraya kopyalar. b ile a artık aynı belleği paylaşmaz, dolayısıyla b[0]'ı değiştirmek a[0]'ı etkilemez, o hâlâ 1'dir.
Go Memory PerformanceZorluk 3
Bu program ne yazdırır?

a := make([]int, 3, 5)
a[0], a[1], a[2] = 1, 2, 3
b := append(a, 4)
b[0] = 99
fmt.Println(a[0])
  • a1
  • b4
  • c99
  • dpanic: index out of range
Açıklama:a'nın length'i 3 ama capacity'si 5'tir; yani yeni dizi ayırmadan bir eleman daha için yer vardır. append(a, 4), b için aynı alttaki diziyi yeniden kullanır; yani a ile b aynı belleği paylaşır (alias). b[0] = 99 yazımı bu paylaşılan diziyi değiştirdiği için a[0] de 99 olur.
Go Memory PerformanceZorluk 2
Bu program ne yazdırır?

nums := []int{10, 20, 30, 40, 50}
sub := nums[1:3]
sub[0] = 999
fmt.Println(nums[1])
  • a20
  • b0
  • c30
  • d999
Açıklama:sub := nums[1:3] hiçbir elemanı kopyalamaz; nums ile aynı alttaki diziye, indeks 1'den başlayarak işaret eden yeni bir slice header'dır. sub[0], nums[1] ile tamamen aynı bellek hücresine karşılık gelir; bu yüzden sub üzerinden yapılan yazım nums'ta da görünür.
Go Memory PerformanceZorluk 2
Bu program ne yazdırır?

src := []int{1, 2, 3, 4, 5}
dst := make([]int, 3)
n := copy(dst, src)
fmt.Println(n, dst)
  • a5 [1 2 3 4 5]
  • b3 [1 2 3]
  • c3 [1 2 3 4 5]
  • d5 [1 2 3]
Açıklama:copy(dst, src), min(len(dst), len(src)) kadar elemanı kopyalar ve bu sayıyı döndürür; dst'yi asla büyütmez. Burada len(dst) 3 olduğundan src'nin yalnızca ilk 3 elemanı kopyalanır ve copy 3 döndürür.
Go Memory PerformanceZorluk 1
Bir fonksiyon, ekstra bellek ayırımlarından kaçınmak için her çağrıda aynı alttaki depolamayı kullanarak boş bir slice'tan başlamak istiyor. Yeni bir dizi ayırmadan bunu sağlayan teknik hangisidir?
  • as = s[:0] ile sıfırlamak; bu, aynı alttaki diziyi ve capacity'yi korurken length'i sıfıra ayarlar
  • bs = []int{} ile yeniden atamak; bu, öncekiyle aynı dizi pointer'ının kullanılacağını garanti eder
  • cHer seferinde s = make([]int, 0) çağırmak; bu her zaman önceki alttaki diziyi yeniden kullanır
  • ds = nil yapıp bir sonraki append'in serbest bırakılan diziyi yeniden kullanmasına güvenmek
Açıklama:s[:0], s'i sıfır uzunluğa yeniden dilimler ama aynı pointer'ı ve capacity'yi korur; böylece sonraki append'ler yeni bir bellek ayırımına gerek kalmadan eski capacity'ye kadar mevcut alttaki diziyi kullanabilir. []int{} ve make([]int, 0) ise her seferinde bağımsız, yepyeni bir slice oluşturur.

3300 soruluk Backend bankasında kendini sına.

Mülakata başla