Özet - unsafe
- Go kursu
- İleri seviye
- Ders 12/68
- 4 dk
unsafe.Pointer ve Sizeof'ı birleştirerek bir bellek inceleyici yazarsın.
unsafe özeti
Bu grupta Sizeof, Alignof ve Offsetof ile bellek yerleşimini ölçtün; unsafe.Pointer ile işaretçi türlerini dönüştürdün; unsafe.String ve unsafe.Slice ile kopyasız dönüşüm yaptın.
Üç kural: uintptr'ı saklama, kopyasız string'in baytlarını değiştirme, önce güvenli alternatifi (ör. math.Float64bits) ara.
Struct'ı inceleyen araç
Üç fonksiyonu birlikte kullanarak bir struct'ın yerleşim raporunu çıkarabilirsin:
var h Hesap
fmt.Println("boyut:", unsafe.Sizeof(h))
fmt.Println("bakiye:", unsafe.Offsetof(h.Bakiye))Bu rapor, sık kullanılan struct'larda alan sırasını değiştirip bellek kazanıp kazanamayacağını gösterir.
Uygulama Yerleşim raporu
type Kayit struct { Aktif bool; ID int64; Puan int32 } tanımla. Struct'ın Sizeof değerini ve ID ile Puan alanlarının Offsetof değerlerini tek satırda yazdır.
Başlangıç kodu
package main
import (
"fmt"
"unsafe"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"unsafe"
)
type Kayit struct {
Aktif bool
ID int64
Puan int32
}
func main() {
var k Kayit
fmt.Println(unsafe.Sizeof(k), unsafe.Offsetof(k.ID), unsafe.Offsetof(k.Puan))
}Beklenen çıktı
24 8 16
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Hangisi derleme anında hesaplanan bir sabittir?
- unsafe.String(p, n)
- uintptr(p)
- unsafe.Sizeof(x) Doğru cevap
- unsafe.Pointer(&x)
Açıklama: Sizeof, Alignof ve Offsetof derleme anında hesaplanır; dönüşümler ise çalışma anında yapılır.
2 Adres aritmetiği
pb := (*int32)(unsafe.____(p, unsafe.Offsetof(k.b)))
pb := (*int32)(unsafe.Add(p, unsafe.Offsetof(k.b)))
Açıklama: unsafe.Add bir işaretçiye bayt ekler; uintptr dönüşümüne gerek bırakmaz.
3 Kural ve nedeni
| Kavram | Anlamı |
|---|---|
uintptr saklama |
GC onu işaretçi saymaz |
Baytları değiştirme |
String değişmezdir |
Alanları sırala |
Dolgu azalır |
Güvenli alternatif |
Taşınabilir kod |